View Javadoc
1   package com.github.mygreen.cellformatter.lang;
2   
3   import java.util.Calendar;
4   import java.util.Date;
5   import java.util.TimeZone;
6   
7   
8   /**
9    * 平成などの時代の期間を表すクラス。
10   * 
11   * @version 0.5
12   * @author T.TSUCHIE
13   */
14  public class EraPeriod {
15      
16      /**
17       * 不明な時代の期間を示すクラス。
18       * <p>存在しない期間を示すにも使用する。
19       * @since 0.5
20       */
21      public static final EraPeriodg/EraPeriod.html#EraPeriod">EraPeriod UNKNOWN_PERIOD = new EraPeriod() {
22          
23          @Override
24          public boolean isUnknown() {
25              return true;
26          }
27          
28      };
29              
30      
31      /** 省略時のローマ字名 (例:H)*/
32      private String abbrevRomanName;
33      
34      /** 省略時の名称(例:平) */
35      private String abbrevName;
36      
37      /** 正式名称(例:平成) */
38      private String name;
39      
40      /** 開始日時(期限がない場合は、nullを設定する) */
41      private Date startDate;
42      
43      /** 終了日時(期限がない場合は、nullを設定する) */
44      private Date endDate;
45      
46      /**
47       * 指定した日時が含まれているかどうか。
48       * @param date チェック対象の日時。タイムゾーンは、{@literal GMT-00:00}である必要がある。
49       * @return true:この時代に含まれている。
50       * @throws IllegalArgumentException {@literal date == null.}
51       */
52      public boolean contains(final Date date) {
53          
54          ArgUtils.notNull(date, "date");
55          
56          if(startDate == null) {
57              return endDate.compareTo(date) >= 0;
58              
59          } else if(endDate == null) {
60              return startDate.compareTo(date) <= 0;
61              
62          } else {
63              return (endDate.compareTo(date) >= 0) && (startDate.compareTo(date) <= 0);
64          }
65          
66      }
67      
68      /**
69       * 指定した日時が、開始日時から経過した年を取得する。
70       * @param cal チェック対象の日時。タイムゾーンは、{@literal GMT-00:00}である必要がある。
71       * @return
72       * @throws IllegalArgumentException {@literal cal == null.}
73       */
74      public int getEraYear(final Calendar cal) {
75          ArgUtils.notNull(cal, "cal");
76          
77          final Calendar startCal = Calendar.getInstance(TimeZone.getTimeZone("GMT-00:00"));
78          startCal.setTime(startDate);
79          
80          final int diff = cal.get(Calendar.YEAR) - startCal.get(Calendar.YEAR) + 1;
81          return diff;
82          
83      }
84      
85      @Override
86      public String toString() {
87          
88          StringBuilder sb = new StringBuilder();
89          sb.append(EraPeriod.class.getSimpleName()).append("[").append(getName()).append("]");
90          if(startDate != null) {
91              sb.append("[start=").append(ExcelDateUtils.formatDate(startDate)).append("]");
92          }
93          
94          if(endDate != null) {
95              sb.append("[end=").append(ExcelDateUtils.formatDate(endDate)).append("]");
96          }
97          
98          return sb.toString();
99          
100     }
101     
102     /**
103      * 元号のローマ字の省略名を取得する。
104      * @return
105      */
106     public String getAbbrevRomanName() {
107         return abbrevRomanName;
108     }
109     
110     /**
111      * 元号のローマ字の省略名を設定する。
112      * @param abbrevRomanName
113      */
114     void setAbbrevRomanName(String abbrevRomanName) {
115         this.abbrevRomanName = abbrevRomanName;
116     }
117     
118     /**
119      * 元号のロケールに対する省略名を取得する。
120      * 
121      * @return 日本語の場合、「平成」だと「平」の値。
122      */
123     public String getAbbrevName() {
124         return abbrevName;
125     }
126     
127     /**
128      * 元号のロケールに対する省略名を設定する。
129      * @param abbrevName ロケールに対する省略名
130      */
131     void setAbbrevName(String abbrevName) {
132         this.abbrevName = abbrevName;
133     }
134     
135     /**
136      * 元号の名称を取得する
137      * @return
138      */
139     public String getName() {
140         return name;
141     }
142     
143     /**
144      * 元号の名称を設定する
145      * @return
146      */
147     void setName(String name) {
148         this.name = name;
149     }
150     
151     /**
152      * 開始日を取得する
153      * @return
154      */
155     public Date getStartDate() {
156         return startDate;
157     }
158     
159     /**
160      * 開始日を設定する
161      * @param startDate
162      */
163     void setStartDate(Date startDate) {
164         this.startDate = startDate;
165     }
166     
167     /**
168      * 終了日を設定する
169      * @param endDate
170      */
171     void setEndDate(Date endDate) {
172         this.endDate = endDate;
173     }
174     
175     /**
176      * 終了日を取得する
177      * @return 終了日がない現行の元号の場合は{@literal null}を返す。
178      */
179     public Date getEndDate() {
180         return endDate;
181     }
182     
183     /**
184      * 不明な期間かどうか。
185      * @since 0.5
186      * @return {@link #UNKNOWN_PERIOD}のインスタンスのとき、trueを返す。
187      */
188     public boolean isUnknown() {
189         return false;
190     }
191     
192 }