teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

・w・

2019/01/16 16:11

投稿

退会済みユーザー
answer CHANGED
@@ -1,3 +1,159 @@
1
1
  というかJava 自体 次の元号は対応してないんだからハードコーディングでよくない?
2
2
 
3
- 可変性を高めるならプロパティファイルで設定して
3
+ 可変性を高めるならプロパティファイルで設定して
4
+
5
+ # 追記
6
+
7
+ プログラム
8
+
9
+ ```java
10
+ import java.text.SimpleDateFormat;
11
+ import java.time.LocalDate;
12
+ import java.time.format.DateTimeFormatter;
13
+ import java.util.Date;
14
+ import java.util.Locale;
15
+ import java.util.Objects;
16
+ import java.util.ResourceBundle;
17
+
18
+ public class GengoValid {
19
+
20
+ ResourceBundle bundle = ResourceBundle.getBundle("calendar");
21
+
22
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("GGGGGy");
23
+
24
+ SimpleDateFormat format = new SimpleDateFormat("Gy", new Locale("ja", "JP", "JP"));
25
+ SimpleDateFormat format2 = new SimpleDateFormat("YYYY-MM-dd");
26
+ {
27
+ format.setLenient(false);
28
+ format2.setLenient(false);
29
+ }
30
+
31
+ public boolean check(String test) {
32
+ System.out.println(format.format(new Date()));
33
+ try {
34
+ test = test.toUpperCase();
35
+
36
+ String g = (test.charAt(0) + "").toUpperCase();
37
+ Integer y = Integer.valueOf(test.substring(1));
38
+
39
+ String start = bundle.getString("calendars." + g + ".start");
40
+ String end = bundle.getString("calendars." + g + ".end");
41
+
42
+ Objects.requireNonNull(start);
43
+
44
+ LocalDate max;
45
+ if (end == null || end.length() == 0) {
46
+ max = LocalDate.now();
47
+ } else {
48
+ max = LocalDate.parse(end);
49
+ }
50
+
51
+ if (y == 1) {
52
+ // 元年はハードコーディング
53
+ return true;
54
+ }
55
+
56
+ LocalDate inp = LocalDate.parse(format2.format(format.parse(test)));
57
+
58
+
59
+ System.out.println(inp);
60
+ System.out.println(max);
61
+
62
+ return inp.isBefore(max) || inp.equals(max);
63
+ } catch (Exception e) {
64
+ return false;
65
+ }
66
+ }
67
+
68
+ }
69
+ ```
70
+
71
+ プロパティファイル
72
+
73
+ ```properties
74
+ calendars.M.start=1868-01-01
75
+ calendars.M.end =1912-07-29
76
+ calendars.T.start=1912-07-30
77
+ calendars.T.end =1926-12-24
78
+ calendars.S.start=1926-12-25
79
+ calendars.S.end =1989-01-07
80
+ calendars.H.start=1989-01-08
81
+ calendars.H.end =2019-04-30
82
+ calendars.X.start=2019-05-01
83
+ calendars.X.end =
84
+ ```
85
+
86
+
87
+ Test
88
+ ```
89
+
90
+ import static org.junit.Assert.*;
91
+
92
+ import org.junit.Test;
93
+
94
+ public class GengoValidTest {
95
+
96
+ GengoValid valid = new GengoValid();
97
+
98
+ @Test
99
+ public void testM1() {
100
+ assertTrue(valid.check("M1"));
101
+ }
102
+
103
+ @Test
104
+ public void testM45() {
105
+ assertTrue(valid.check("M45"));
106
+ }
107
+
108
+ @Test
109
+ public void testM46() {
110
+ assertFalse(valid.check("M46"));
111
+ }
112
+
113
+ @Test
114
+ public void testT1() {
115
+ assertTrue(valid.check("T1"));
116
+ }
117
+
118
+ @Test
119
+ public void testT15() {
120
+ assertTrue(valid.check("T15"));
121
+ }
122
+
123
+ @Test
124
+ public void testT16() {
125
+ assertFalse(valid.check("T16"));
126
+ }
127
+
128
+ @Test
129
+ public void testS1() {
130
+ assertTrue(valid.check("S1"));
131
+ }
132
+
133
+ @Test
134
+ public void testS64() {
135
+ assertTrue(valid.check("S64"));
136
+ }
137
+
138
+ @Test
139
+ public void testS65() {
140
+ assertFalse(valid.check("S65"));
141
+ }
142
+
143
+ @Test
144
+ public void testH1() {
145
+ assertTrue(valid.check("H1"));
146
+ }
147
+
148
+ @Test
149
+ public void testH31() {
150
+ assertTrue(valid.check("H31"));
151
+ }
152
+
153
+ @Test
154
+ public void testH32() {
155
+ assertFalse(valid.check("H32"));
156
+ }
157
+
158
+ }
159
+ ```