いろいろ検証していたら遅くなりました。
申し訳ございません。
以下書いてみましたが、いかがでしょうか。
(lombokなど入れてないのでgetter, setter直書きで見づらいです。すみません。)
Main
1import java.text.ParseException;
2import java.text.SimpleDateFormat;
3import java.util.Calendar;
4import java.util.GregorianCalendar;
5
6public class Main {
7 public static void main(String[] args) {
8 try {
9 TestBean bean = new TestBean();
10
11 // 日付指定K
12 bean.setkYear("2020");
13 bean.setkMonth("08");
14 bean.setkDay("20");
15 bean.setkHour("10");
16 bean.setkMinute("00");
17
18 // 日付指定I
19 bean.setiYear("2020");
20 bean.setiMonth("08");
21 bean.setiDay("22");
22 bean.setiHour("10");
23 bean.setiMinute("00");
24
25 // オプションO
26 bean.setoDay("2日前");
27 bean.setoHour("09");
28
29 String message = checkRange(bean);
30 if (message == null) {
31 System.out.println("エラーなし");
32 } else {
33 System.out.println(message);
34 }
35
36 } catch (ParseException e) {
37 e.printStackTrace();
38 }
39 }
40
41 private static String checkRange(TestBean bean) throws ParseException {
42 String message = null;
43
44 // 指定日付IをCalenderに変換
45 Calendar iDate = new GregorianCalendar();
46 iDate.set(
47 Integer.parseInt(bean.getiYear()),
48 Integer.parseInt(bean.getiMonth()),
49 Integer.parseInt(bean.getiDay()),
50 Integer.parseInt(bean.getiHour()),
51 Integer.parseInt(bean.getiMinute()));
52
53 // 指定日付KをCalenderに変換
54 String kString = bean.getkYear() + bean.getkMonth() + bean.getkDay() + bean.getkHour() + bean.getkMinute();
55 Calendar kDate = new GregorianCalendar();
56 kDate.set(
57 Integer.parseInt(bean.getkYear()),
58 Integer.parseInt(bean.getkMonth()),
59 Integer.parseInt(bean.getkDay()),
60 Integer.parseInt(bean.getkHour()),
61 Integer.parseInt(bean.getkMinute()));
62
63 // オプション比較用のベースとなる日付設定
64 // 指定日付Kの年月日 + オプションOの時 + 指定日付Kの分(ここでは202008220900が設定される)
65 String oString = bean.getiYear() + bean.getiMonth() + bean.getiDay() + bean.getoHour() + bean.getiMinute();
66 Calendar oDate = new GregorianCalendar();
67 oDate.set(
68 Integer.parseInt(bean.getiYear()),
69 Integer.parseInt(bean.getiMonth()),
70 Integer.parseInt(bean.getiDay()),
71 Integer.parseInt(bean.getoHour()), // 時間のみオプションの時間を設定
72 Integer.parseInt(bean.getiMinute()));
73 // 上記日付をマイナスする
74 if (OptionEnum.getDayFromLabel(bean.getoDay()) != null) {
75 oDate.add(Calendar.DAY_OF_MONTH, - OptionEnum.getDayFromLabel(bean.getoDay()).getDayValue());
76 }
77
78 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
79 System.out.println("指定日付K = " + sdf.format(kDate.getTime()));
80 System.out.println("指定日付I = " + sdf.format(iDate.getTime()));
81 System.out.println("指定日付I - オプションO = " + sdf.format(oDate.getTime()));
82
83 /*
84 * 指定日付Iと指定日付Kの比較
85 */
86 if (iDate.compareTo(kDate) < 0) {
87 // 指定日付I < 指定日付K の場合エラー
88 return "指定日付I・指定日付K相関エラー";
89 } else if (oDate.compareTo(kDate) < 0) {
90 // (指定日付I - オプションO) < 指定日付K の場合エラー
91 return "オプション値の整合性エラー";
92 }
93 return null;
94 }
95}
TestBean
1public class TestBean {
2 private String kYear;
3 private String kMonth;
4 private String kDay;
5 private String kHour;
6 private String kMinute;
7 private String iYear;
8 private String iMonth;
9 private String iDay;
10 private String iHour;
11 private String iMinute;
12 private String oDay;
13 private String oHour;
14
15 public String getkYear() {
16 return kYear;
17 }
18 public void setkYear(String kYear) {
19 this.kYear = kYear;
20 }
21 public String getkMonth() {
22 return kMonth;
23 }
24 public void setkMonth(String kMonth) {
25 this.kMonth = kMonth;
26 }
27 public String getkDay() {
28 return kDay;
29 }
30 public void setkDay(String kDay) {
31 this.kDay = kDay;
32 }
33 public String getkHour() {
34 return kHour;
35 }
36 public void setkHour(String kHour) {
37 this.kHour = kHour;
38 }
39 public String getkMinute() {
40 return kMinute;
41 }
42 public void setkMinute(String kMinute) {
43 this.kMinute = kMinute;
44 }
45 public String getiYear() {
46 return iYear;
47 }
48 public void setiYear(String iYear) {
49 this.iYear = iYear;
50 }
51 public String getiMonth() {
52 return iMonth;
53 }
54 public void setiMonth(String iMonth) {
55 this.iMonth = iMonth;
56 }
57 public String getiDay() {
58 return iDay;
59 }
60 public void setiDay(String iDay) {
61 this.iDay = iDay;
62 }
63 public String getiHour() {
64 return iHour;
65 }
66 public void setiHour(String iHour) {
67 this.iHour = iHour;
68 }
69 public String getiMinute() {
70 return iMinute;
71 }
72 public void setiMinute(String iMinute) {
73 this.iMinute = iMinute;
74 }
75 public String getoDay() {
76 return oDay;
77 }
78 public void setoDay(String oDay) {
79 this.oDay = oDay;
80 }
81 public String getoHour() {
82 return oHour;
83 }
84 public void setoHour(String oHour) {
85 this.oHour = oHour;
86 }
87}
OptionEnum
1public enum OptionEnum {
2 DAY_1("1日前", 0),
3 DAY_2("2日前", 2),
4 DAY_3("3日前", 3),
5 WEEK_1("1週間前", 7),
6 WEEK_2("2週間前", 14);
7
8 private String label;
9 private int dayValue;
10
11 private OptionEnum(String label, int dayValue) {
12 this.label = label;
13 this.dayValue = dayValue;
14 }
15
16 public String getLabel() {
17 return label;
18 }
19
20 public int getDayValue() {
21 return dayValue;
22 }
23
24 public static OptionEnum getDayFromLabel(String label) {
25 for (OptionEnum optionEnum : OptionEnum.values()) {
26 if (optionEnum.getLabel().equals(label)) {
27 return optionEnum;
28 }
29 }
30 return null;
31 }
32}