001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.fukurou.util;
017
018 import java.util.Arrays;
019 import java.util.Calendar;
020 import java.util.Date;
021 import java.util.Locale;
022 import java.util.Map;
023 import java.util.HashMap;
024 import java.text.DateFormat;
025 import java.text.SimpleDateFormat;
026 import java.text.ParseException;
027
028 /**
029 * HybsDateUtil.java は、å?通的に使用されã‚?Date,Calender関連メソãƒ?ƒ‰を集ç´?�—たã?staticメソãƒ?ƒ‰のみで構æ?されるクラスですã?
030 *
031 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
032 *
033 * @og.group ユーãƒ?‚£リãƒ?‚£
034 *
035 * @version 5.5
036 * @author Kazuhiko Hasegawa
037 * @since JDK7.0,
038 */
039 public final class HybsDateUtil {
040
041 /** シスãƒ?ƒ 依存ã?改行記号をセãƒ?ƒˆしますã? */
042 private static final String CR = System.getProperty("line.separator");
043
044 /** å�?¨®フォーマットを簡易的に表したæ–?—å? */
045 private static final Map<String,String> DATE_FORMAT = new HashMap<String,String>();
046 static {
047 DATE_FORMAT.put( "YMD" ,"yyyyMMdd" );
048 DATE_FORMAT.put( "Y2MD" ,"yyMMdd" );
049 DATE_FORMAT.put( "YM" ,"yyyyMM" );
050 DATE_FORMAT.put( "MD" ,"MMdd" ); // 5.5.5.2 (2012/08/18)
051 DATE_FORMAT.put( "HMS" ,"HHmmss" );
052 DATE_FORMAT.put( "YMDHMS" ,"yyyyMMddHHmmss" );
053 DATE_FORMAT.put( "EEE" ,"EEE" );
054 DATE_FORMAT.put( "YMDF" ,"yyyy/MM/dd" );
055 DATE_FORMAT.put( "Y2MDF" ,"yy/MM/dd" );
056 DATE_FORMAT.put( "YMF" ,"yyyy/MM" );
057 DATE_FORMAT.put( "HMSF" ,"HH:mm:ss" );
058 DATE_FORMAT.put( "YMDHMSF" ,"yyyy/MM/dd HH:mm:ss" );
059 DATE_FORMAT.put( "MDF" ,"MM/dd" ); // 5.5.0.2 (2012/03/09) 和暦
060 DATE_FORMAT.put( "MDEF" ,"MM/dd(EEE)" ); // 5.5.0.2 (2012/03/09) 和暦
061 DATE_FORMAT.put( "MD2F" ,"MMæœ?d日" ); // 5.5.5.2 (2012/08/18) 和暦
062 DATE_FORMAT.put( "GYMDF" ,"GGGGyyyy年MMæœ?d日" ); // 5.5.0.2 (2012/03/09) 和暦
063 DATE_FORMAT.put( "G2YMDF" ,"Gyyyy/MM/dd" ); // 5.5.0.2 (2012/03/09) 和暦
064 DATE_FORMAT.put( "GYMF" ,"GGGGyyyy年MMæœ? ); // 5.5.0.2 (2012/03/09) 和暦
065 DATE_FORMAT.put( "GYF" ,"GGGGyyyy" ); // 5.5.0.2 (2012/03/09) 和暦
066 }
067
068 /**
069 * ãƒ?ƒ•ォルトコンストラクターをprivateにしてã€?
070 * オブジェクトã?生æ?をさせなã�?‚ˆã�?�«するã€?
071 *
072 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
073 *
074 */
075 private HybsDateUtil() {}
076
077 /**
078 * 現在日付ã?時刻を指定ã?フォーマットでæ–?—å?に変換して返しますã?
079 * 出力フォーマットã?ã€?yyyy/MM/dd HH:mm:ss" 固定ですã?
080 *
081 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
082 *
083 * @return 現在日付ã?時刻 ( ä¾?2012/09/05 18:10:24 )
084 */
085 public static final String getDate() {
086 DateFormat formatter = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss",Locale.JAPAN );
087 return formatter.format(new Date());
088 }
089
090 /**
091 * 現在時刻を指定ã?フォーマットでæ–?—å?に変換して返しますã?
092 * フォーマットã?æŒ?®š方法ã?、java.text.SimpleDateFormat のæŒ?®š方法と同ä¸?�§すã?
093 * 変換時ã?ロケーションは、Locale.JAPAN ですã?
094 * 現在時刻は、new Date() で求めますã?
095 *
096 * @param form フォーãƒ?–‡字å? ( ä¾?"yyyy/MM/dd HH:mm:ss.SSS" )
097 *
098 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
099 *
100 * @return 現在日付ã?時刻
101 * @see java.text.SimpleDateFormat
102 */
103 public static final String getDate( final String form ) {
104 DateFormat formatter = new SimpleDateFormat( form,Locale.JAPAN );
105 return formatter.format( new Date() );
106 }
107
108 /**
109 * æŒ?®š時刻を指定ã?フォーマットでæ–?—å?に変換して返しますã?
110 * フォーマットã?æŒ?®š方法ã?、java.text.SimpleDateFormat のæŒ?®š方法と同ä¸?�§すã?
111 * 変換時ã?ロケーションは、Locale.JAPAN ですã?
112 * æŒ?®š時刻は、new Date( time ) で求めますã?
113 *
114 * @param time æŒ?®šã?カレントタイãƒ??ロング値
115 * @param form フォーãƒ?–‡字å? ( ä¾?"yyyy/MM/dd HH:mm:ss.SSS" )
116 *
117 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
118 *
119 * @return 現在日付ã?時刻( ä¾?2001/04/17 15:48:22 )
120 */
121 public static final String getDate( final long time,final String form ) {
122 DateFormat formatter = new SimpleDateFormat( form,Locale.JAPAN );
123 return formatter.format( new Date( time ) );
124 }
125
126 /**
127 * æŒ?®šã?æ–?—å?から、以下ã?æ–?—を削除したæ–?—å?を返しますã?
128 * '/' , '-' , ' ' , ':' の数字以外ã?æ–?—を含ã‚?ƒ•ォーマットされた
129 * 日付文字å?をã?日付データã�?�‘に変換する場合に利用することを想定してã�?�¾すã?
130 * よって、ã?イナス記号ã‚??小数点、コンマなども削除されますã?
131 * こã?メソãƒ?ƒ‰では、日付としての整合æ?ã‚?¡�チェãƒ?‚¯は行いませんã€?
132 *
133 * 引数がã?null の場合ã?、ゼロæ–?—å?に、変換しますã?
134 *
135 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
136 * @og.rev 5.5.8.3 (2012/11/17) 数字ã?み返す仕様だったが、対象以外ã?æ–?—å?力ã?そã?まま返すよう変更
137 *
138 * @param value 任意ã?æ–?—å??ˆ例ï¼?001/04/17 15:48:22??
139 *
140 * @return 数字だけで構æ?される文字å??ˆ例ï¼?0010417154822??nullはゼロæ–?—å?を返しまã�?
141 */
142 public static final String parseNumber( final String value ) {
143 if( value == null ) { return ""; }
144
145 StringBuilder buf = new StringBuilder();
146 for( int i=0; i<value.length(); i++ ) {
147 char ch = value.charAt(i);
148 // if( ch >= '0' && ch <= '9' ) { buf.append( ch ); }
149 if( ch == '/' || ch == '-' || ch == ' ' || ch == ':'){} // 5.5.8.3 (2012/11/17) 何もしなã�?
150 else {
151 buf.append( ch );
152 }
153 }
154
155 return buf.toString();
156 }
157
158 /**
159 * æŒ?®šã?æ–?—å?から、yyyy-mm-dd hh:mm:ss[.f...] 形式ã?æ–?—å?を作æ?しますã?
160 * これは、java.sql.Timestamp オブジェクトをæ–?—å?から作æ?するに当たりã?
161 * Timestamp のæ–?—å?形式にしなければならなã�?�Ÿめですã?
162 * 桁数はã€?¼˜æ¡?またã?ã€?¼‘4桁以外ã?場合ã?、変換エラーとしますã?
163 *
164 * @og.rev 5.5.8.5 (2012/11/27) 新規作æ?
165 *
166 * @param value 任意ã?æ–?—å??ˆ例ï¼?0010417 or 20010417154822??
167 *
168 * @return Timestampのæ–?—å?形式(例ï¼?001-04-17 00:00:00 or 2001-04-17 15:48:22??
169 */
170 public static final String parseTimestamp( final String value ) {
171 if( value == null || ( value.length() != 8 && value.length() != 14 ) ) {
172 String errMsg = "日付文字å?に、不正な値が指定されました。8æ¡?またã?ã€?¼‘4桁でæŒ?®šしてくださいã€?
173 + " value=[" + value + "]" ;
174 throw new RuntimeException( errMsg );
175 }
176
177 StringBuilder buf = new StringBuilder();
178 buf.append( value.substring( 0,4 ) ).append( "-" );
179 buf.append( value.substring( 4,6 ) ).append( "-" );
180 buf.append( value.substring( 6,8 ) ).append( " " );
181 if( value.length() == 8 ) {
182 buf.append( "00:00:00" );
183 }
184 else {
185 buf.append( value.substring( 8,10 ) ).append( ":" );
186 buf.append( value.substring( 10,12 ) ).append( ":" );
187 buf.append( value.substring( 12,14 ) );
188 }
189
190 return buf.toString();
191 }
192
193
194 /**
195 * 日付文字å?の桁数の整合æ?を取りますã?
196 * これは、å?部で、parseNumber(String) 処ç�?�«より、不要なフォーマット記号を削除しますã?
197 * ここでは、基本çš?�«はã€?¼–文字ï¼?yyyMM?‰ã??˜文字ï¼?yyyMMdd?‰ã??‘4文字ï¼?yyyMMddHHmmss??
198 * の日付文字å?を作æ?することを想定してã�?�¾すが、指定ã?桁数以外ã?、エラーになりますã?
199 *
200 * 引数がã?null â‡?桁数に無関係に、空æ–?—å?を返すã€?
201 * 引数の桁数がä¸?? â‡?そã?値を返すã€?
202 * 引数の桁数が不ä¸?? â‡?エラー
203 * ただしã?引数のæœ?¤§長はã€?¼‘4ケタに制限してã�?�¾すã?
204 *
205 * こã?メソãƒ?ƒ‰では、日付として成立してã�?‚‹かどã�?�‹??9999999など?‰ã?判定してã�?�¾せんã€?
206 *
207 * @og.rev 5.6.6.0 (2013/07/05) メソãƒ?ƒ‰のå†?®¹を移すã?
208 *
209 * @param value 任意ã?日付けæ–?—å?
210 * @param size 変換したã�?¡�数
211 *
212 * @return 数字だけで構æ?される文字å??ˆ例ï¼?0010417154822??nullはゼロæ–?—å?を返しまã�?
213 */
214 public static final String parseDate( final String value , final int size ) {
215 return parseDate( value , size , size ); // æœ?°�とæœ?¤§を同じå?にするã€?
216 }
217
218 /**
219 * 日付文字å?の桁数の整合æ?を取りますã?
220 * これは、å?部で、parseNumber(String) 処ç�?�«より、不要なフォーマット記号を削除しますã?
221 * ここでは、基本çš?�«はã€?¼–文字ï¼?yyyMM?‰ã??˜文字ï¼?yyyMMdd?‰ã??‘4文字ï¼?yyyMMddHHmmss??
222 * の日付文字å?を作æ?することを想定してã�?�¾すが、それ以外ã?桁数でも下記ã?ルールに従って
223 * 処ç�?�•れますã?
224 *
225 * 引数がã?null â‡?桁数に無関係に、空æ–?—å?を返すã€?
226 * 引数の桁数がç¯?›²å†? â‡?以下ã?処ç�?‚’実行するã?
227 * 引数の桁数を同ã�? â‡?そã?まま返すã€?
228 * 引数の桁数より大きい â‡?余をカãƒ?ƒˆして、引数のæœ?¤§長にそろえるã€?
229 * 引数の桁数に足りなã�?â‡?"20000101000000" のæ–?—å?の部åˆ?–‡字å?を結合させて、引数のæœ?¤§長にそろえるã€?
230 * ただしã?引数のæœ?¤§長はã€?¼‘4ケタに制限してã�?�¾すã?
231 *
232 * こã?メソãƒ?ƒ‰では、日付として成立してã�?‚‹かどã�?�‹??9999999など?‰ã?判定してã�?�¾せんã€?
233 *
234 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
235 * @og.rev 5.6.1.1 (2013/02/08) 桁数チェãƒ?‚¯導å?。6桁以下だとエラーにするã€?
236 * @og.rev 5.6.6.0 (2013/07/05) 桁数チェãƒ?‚¯のæœ?°?æœ?¤§æŒ?®?
237 *
238 * @param value 任意ã?日付けæ–?—å?
239 * @param minSize 変換したã�?¡�数のæœ?°�å?
240 * @param maxSize 変換したã�?¡�数のæœ?¤§値
241 *
242 * @return 数字だけで構æ?される文字å??ˆ例ï¼?0010417154822??nullはゼロæ–?—å?を返しまã�?
243 */
244 // public static final String parseDate( final String value , final int size ) {
245 public static final String parseDate( final String value , final int minSize , final int maxSize ) {
246 if( value == null ) { return ""; }
247
248 String rtn = parseNumber( value );
249
250 // 引数のæœ?¤§長はã€?¼‘4ケタに制限してã�?�¾すã?
251 if( maxSize > 14 ) {
252 String errMsg = "日付登録に許可できるæœ?¤§桁数はã€?¼‘4ケタですã?"
253 + " maxSize=[" + maxSize + "]" ;
254 throw new RuntimeException( errMsg );
255 }
256
257 // int maxSize = ( size > 14 ) ? 14 : size ; // 先にæœ?¤§サイズを求めておく
258 int len = rtn.length() ;
259
260 if( len == maxSize ) { rtn = value; }
261 // else if( len > maxSize ) { rtn = rtn.substring( 0,maxSize ); }
262 // 5.6.1.1 (2013/02/08) 桁数チェãƒ?‚¯導å?。6桁以下だとエラーにするã€?
263 // else if( len < 6 ) {
264 // 5.6.6.0 (2013/07/05) 桁数チェãƒ?‚¯のæœ?°?æœ?¤§æŒ?®šで、ç¯?›²外ã?エラー
265 else if( len < minSize || len > maxSize ) {
266 String errMsg = "日付文字å?に、不正な値が指定されました。最小["
267 + minSize + "] から、最大[" + maxSize + "]のç¯?›²でæŒ?®šしてくださいã€?
268 + " value=[" + value + "]" ;
269 throw new RuntimeException( errMsg );
270 }
271 else {
272 rtn = rtn + "20000101000000".substring( len,maxSize ) ; // 中間文字å?を加えるã€?
273 }
274
275 return rtn ;
276 }
277
278 /**
279 * 日付文字å?の厳å¯?�ª整合æ?チェãƒ?‚¯を行いますã?
280 * ここでæŒ?®šできるのはã€?¼˜文字ï¼?yyyMMdd?‰ã??‘4文字ï¼?yyyMMddHHmmss?‰ã?どちらかの
281 * 数字だけã?日付文字å?であり、それが、日付として正しいかどã�?�‹のチェãƒ?‚¯を行いますã?
282 * 正しけれã?、true をã?間違ってã�?‚Œば、false を返しますã?
283 * ここではã€?0120230?ˆ2月?“0日?‰などの日付やã€?0120101235960 などã‚?false になりますã?
284 * 引数がã?null および、空æ–?—å?の場合も、false を返しますã?でã€?�¿けたã�??合ã?、事前に
285 * 判定しておいてくださいã€?
286 *
287 * å†?ƒ¨処ç�?�¨しては、DateFormat で、setLenient( false ) を設定することでã€?
288 * 日ä»?時刻解析を厳å¯?�«解析するにして、ParseException が発生しなã�?�‹どã�?�‹判定してã�?�¾すã?
289 *
290 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
291 *
292 * @param value 数字だけで構æ?される日付けæ–?—å?
293 *
294 * @return true:日付として正しい場å�?false:日付として間違ってã�?‚‹場å�?
295 */
296 public static final boolean isStrict( final String value ) {
297 if( value == null || ( value.length() != 8 && value.length() != 14 ) ) { return false; }
298
299 // 日付ã?厳å¯?�ªチェãƒ?‚¯
300 String form = (value.length() == 8) ? "yyyyMMdd" : "yyyyMMddHHmmss" ;
301 DateFormat formatter = new SimpleDateFormat( form,Locale.JAPAN );
302 formatter.setLenient( false ); // 日ä»?時刻解析を厳å¯?�«行う(false=厳å¯?
303
304 boolean flag ;
305 try {
306 formatter.parse( value );
307 flag = true;
308 }
309 catch( ParseException ex ) {
310 flag = false;
311 }
312
313 return flag;
314 }
315
316 /**
317 * 日付関係ã?æƒ??を簡易的に処ç�?�—ますã?
318 *
319 * 第ä¸?¼•数 "XXXX" は、日付å?ç�?‚’行うフォーマットã?予ç´?ªžになってã�?�¾すã?
320 * ・YMDã€???š8文字ã?日付データ(yyyyMMdd)を扱ã�?�¾すã?
321 * ・Y2MDã€??š6文字ã?日付データ(yyMMdd)を扱ã�?�¾すã?
322 * ・YMã€?? ?š6文字ã?日付データ(yyyyMM)を扱ã�?�¾すã?
323 * ・MDã€?? ?š4文字ã?日付データ(MMdd)を扱ã�?�¾すã?(5.5.5.2 追åŠ?
324 * ・HMSã€???š6文字ã?時刻ãƒ??タ(HHmmss)を扱ã�?�¾すã?
325 * ・YMDHMS ?š14文字ã?日付データ(yyyyMMddHHmmss)を扱ã�?�¾すã?
326 * ・EEEã€???š曜日をデフォルトロケール(EEE)で表示しますã?
327 *
328 * F付きは、フォーマットされた日付を返しますã?
329 * ・YMDFã€??š10文字ã?日付表現(yyyy/MM/dd)を扱ã�?�¾すã?
330 * ・Y2MDFã€?¼š8文字ã?日付表現(yy/MM/dd)を扱ã�?�¾すã?
331 * ・YMFã€???š7文字ã?日付表現(yyyy/MM)を扱ã�?�¾すã?
332 * ・HMSFã€??š8文字ã?時刻表現(HH:mm:ss)を扱ã�?�¾すã?
333 * ・YMDHMSF?š19文字ã?日付表現(yyyy/MM/dd HH:mm:ss)を扱ã�?�¾すã?
334 * ・MDFã€???š5文字ã?月日表現(MM/dd)を扱ã�?�¾すã?
335 * ・MDEFã€??š5文字+曜日の月日表現(MM/dd(EEE))を扱ã�?�¾すã?
336 * ・MD2Fã€??š和暦の月日表現(MMæœ?d日)を扱ã�?�¾すã?(5.5.5.2 追åŠ?
337 * ・GYMDFã€?¼š和暦の年月日表現(GGGGyyyy年MMæœ?d日)を扱ã�?�¾すã?
338 * ・G2YMDF ?š和暦の日付表現(Gyyyy/MM/dd)を扱ã�?�¾すã?
339 * ・GYMFã€??š和暦の年月表現(GGGGyyyy年MMæœ?を扱ã�?�¾すã?
340 * ・GYFã€???š和暦の年表現(GGGGyyyy)を扱ã�?�¾すã?
341 *
342 * なおã?上記以外ã?フォーマットをæŒ?®šするå?合ã?、XXXX部åˆ?�«直接記述できますã?(5.5.5.2 追åŠ?
343 * ただしã?基本çš?�«は、è?由フォーマットã?、エラーチェãƒ?‚¯がなã�?‚º、使わなã�?�§くださいã€?
344 *
345 * 第二引数 AA は、基準となる日付を、yyyyMMdd形式でæŒ?®šしますã?nullの場合ã?、現在時刻を使用しますã?
346 * æŒ?®šできる日付ã?、yyyyMMdd形式を推奨しますがã€?¼˜文字でなã�??合ã?ã€?-' ã‚?'/' を削除の上ã?
347 * 前半?˜文字ã?み使用しますã?たとえã?ã€?2012/09/05 16:52:36" のようなフォーマットデータが渡されã�?
348 * 場合ã?"20120905 16:52:36" に変換後ã?前半?˜文字ã? "20120905" が使われますã?
349 * よって、フォーマットされてã�?‚‹場合でもå?ç�?‚’おこなã�?�¾すが、月、日はã€??ゼロ埋めの?’文字で
350 * 渡してくださいã€?
351 *
352 * 第三引数 BB は、日付につã�?�¦のåŠ?¸›算å?ç�?‚’行うためのコマンドをæŒ?®šしますã?
353 * nullの場合ã?、なにも加減算å?ç�?‚’行いませんã€?
354 * ・SD ?š当月のæœ??の日付にセãƒ?ƒˆしますã?(当月?‘日)
355 * ・ED ?š当月のæœ?¾Œã?日付にセãƒ?ƒˆしますã?(当月月末)
356 * ・SW ?š日付å?ç�??週初め(月曜日)にセãƒ?ƒˆしますã?日付ã?当日より前に移動しますã?
357 * ・EW ?š日付å?ç�??週末(日曜日)にセãƒ?ƒˆしますã?日付ã?当日より後ろに移動しますã?
358 * ・H1 ??HXXX ?š時を指定ã?åˆ?� けé?めますã?H1なら1時間後ã?H24 なら24時間å¾?5.5.5.6 (2012/08/31) 追åŠ?
359 * ・D1 ??DXXX ?š日を指定ã?åˆ?� けé?めますã?D1なら翌日、D200 なã‚?00日å¾?
360 * ・M1 ??MXXX ?š月を指定ã?åˆ?� けé?めますã?M1なら翌月、M6 なら半年å¾?
361 * ・BSD ?šå?月ã?æœ??の日付にセãƒ?ƒˆしますã?(先月?‘日)(5.5.5.2 追åŠ?
362 * ・BED ?šå?月ã?æœ?¾Œã?日付にセãƒ?ƒˆしますã?(先月月末)(5.5.5.2 追åŠ?
363 * ・ASD ?š翌月のæœ??の日付にセãƒ?ƒˆしますã?(翌月?‘日)(5.5.5.2 追åŠ?
364 * ・AED ?š翌月のæœ?¾Œã?日付にセãƒ?ƒˆしますã?(翌月月末)(5.5.5.2 追åŠ?
365 *
366 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
367 * @og.rev 5.6.1.1 (2013/02/08) prmB処ç�?‚’、calendarCalc メソãƒ?ƒ‰へ移å‹?
368 *
369 * @param key フォーマットã?予ç´?ª?
370 * @param prmA 基準となる日ä»?nullの場合ã?、å?ç�?™‚刻)
371 * @param prmB 処ç�?‚³マンãƒ?
372 *
373 * @return メãƒ?‚»ージæƒ??
374 */
375 public static final String getDateFormat( final String key ,final String prmA ,final String prmB ) {
376
377 // prmA ã�?null の場合ã?、そのまま、現在時刻が使われますã?
378 Calendar now = getCalendar( prmA );
379
380 // 5.6.1.1 (2013/02/08) getDateFormat( String ,String ,String ) からåˆ?›¢ã€?
381 calendarCalc( now,prmB );
382
383 // if( prmB != null ) {
384 // if( "SD".equals( prmB ) ) { now.set( Calendar.DATE,1 ); }
385 // else if( "ED".equals( prmB ) ) { now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) ); }
386 // // 5.5.5.2 (2012/08/18) BSD,BED,ASD,AED 追åŠ?
387 // else if( "BSD".equals( prmB ) ) { // (先月?‘日)
388 // now.roll( Calendar.MONTH,false ); now.set( Calendar.DATE,1 );
389 // }
390 // else if( "BED".equals( prmB ) ) { // (先月月末)
391 // now.roll( Calendar.MONTH,false ); now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) );
392 // }
393 // else if( "ASD".equals( prmB ) ) { // (翌月?‘日)
394 // now.roll( Calendar.MONTH,true ); now.set( Calendar.DATE,1 );
395 // }
396 // else if( "AED".equals( prmB ) ) { // (翌月月末)
397 // now.roll( Calendar.MONTH,true ); now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) );
398 // }
399 // else if( "SW".equals( prmB ) ) {
400 // // 日付型æ–?—å?入力データの開始日を月曜日にセãƒ?ƒˆしますã?
401 // // SUNDAY=1 , MONDAY=2 になりますã?月曜日との差ã�?�‘、前に戻しますã?
402 // // æŒ?®š日が日曜日の場合ã?、月曜日まで戻しますã?
403 // int shu = now.get( Calendar.DAY_OF_WEEK ) - Calendar.MONDAY ;
404 //
405 // if( shu > 0 ) { now.add( Calendar.DATE, -shu ); }
406 // else if( shu < 0 ) { now.add( Calendar.DATE, -6 ); } // 日曜日の処ç�?
407 //
408 // }
409 // else if( "EW".equals( prmB ) ) {
410 // // 日付型æ–?—å?入力データの終äº?—¥を日曜日にセãƒ?ƒˆしますã?
411 // // SUNDAY=1 , MONDAY=2 になりますã?日曜日になるよã�?�«、å?に進めますã?
412 // int shu = now.get( Calendar.DAY_OF_WEEK ) ;
413 //
414 // if( shu != Calendar.SUNDAY ) { now.add( Calendar.DATE, 8-shu ); }
415 // }
416 // // 5.5.5.6 (2012/08/31) H1 ??HXXX 追åŠ??時間のåŠ?®—をæŒ?®šできるã€?
417 // else if( prmB.startsWith( "H" ) && prmB.length() > 1 ) {
418 // int hour = Integer.parseInt( prmB.substring( 1 ) );
419 // now.add( Calendar.HOUR_OF_DAY, hour );
420 // }
421 // else if( prmB.startsWith( "D" ) && prmB.length() > 1 ) {
422 // int day = Integer.parseInt( prmB.substring( 1 ) );
423 // now.add( Calendar.DATE, day );
424 // }
425 // else if( prmB.startsWith( "M" ) && prmB.length() > 1 ) {
426 // int month = Integer.parseInt( prmB.substring( 1 ) );
427 // now.add( Calendar.MONTH , month );
428 // }
429 // else {
430 // String errMsg = "日付変数パラメータに、不正な値が指定されました。以下ã?中からæŒ?®šしなおしてくださいã€?
431 // + "æŒ?®š可能?š[SD,ED,BSD,BED,ASD,AED,SW,EW,D1?žDXXX,M1?žMXXX]"
432 // + " prmB=[" + prmB + "]" ;
433 // throw new RuntimeException( errMsg );
434 // }
435 // }
436
437 String format = DATE_FORMAT.get( key );
438 if( format == null ) {
439 // // DATE_FORMAT に存在しなã�?ƒ•ォーマットをæŒ?®šしてもã?エラーにしません。たã�?�—、後å?ç�?�§フォーマットエラーになる可能性は残りますã?
440 // String errMsg = "日付変数キーに、不正な値が指定されました。以下ã?中からæŒ?®šしなおしてくださいã€?
441 // + CR
442 // + "æŒ?®š可能?? + Arrays.toString( DATE_FORMAT.keySet().toArray( new String[DATE_FORMAT.size()] ) ) // 5.5.5.2 (2012/08/18)
443 // + CR
444 // + " key=[" + key + "]" ;
445 // // 5.5.5.2 (2012/08/18) 自由フォーマットを設定可能としますã?
446 // System.err.println( "CommonTagSupport {@DATE.XXXX AA BB} 警å‘? );
447 // System.err.println( errMsg );
448 format = key; // 5.5.5.2 (2012/08/18) 自由フォーマット指å®?
449 }
450
451 //5.5.0.2 先é?Gの場合ã?和暦なのでformatterのLocaleを変更する
452 DateFormat formatter = null;
453 if( key.indexOf('G') == 0 ){
454 formatter = new SimpleDateFormat( format, new Locale("ja","JP","JP"));
455 }
456 else{
457 formatter = new SimpleDateFormat( format,Locale.JAPAN );
458 }
459
460 return formatter.format( now.getTime() );
461 }
462
463 /**
464 * 開始前設定å?、またã? 終äº?¾Œ設定å?のæ–?—å?から、オプションæ–?—å?を合成しますã?
465 * 基準となる日付に計算した結果を反æ˜?�•せますã?
466 *
467 * prmB は、日付につã�?�¦のåŠ?¸›算å?ç�?‚’行うためのコマンドをæŒ?®šしますã?
468 * ・SD ?š当月のæœ??の日付にセãƒ?ƒˆしますã?(当月?‘日)
469 * ・ED ?š当月のæœ?¾Œã?日付にセãƒ?ƒˆしますã?(当月月末)
470 * ・SW ?š日付å?ç�??週初め(月曜日)にセãƒ?ƒˆしますã?日付ã?当日より前に移動しますã?
471 * ・EW ?š日付å?ç�??週末(日曜日)にセãƒ?ƒˆしますã?日付ã?当日より後ろに移動しますã?
472 * ・D1 ??DXXX ?š日を指定ã?åˆ?� けé?めますã?D1なら翌日、D200 なã‚?00日å¾?
473 * ・M1 ??MXXX ?š月を指定ã?åˆ?� けé?めますã?M1なら翌月、M6 なら半年å¾?
474 * ・BSD ?šå?月ã?æœ??の日付にセãƒ?ƒˆしますã?(先月?‘日)(5.5.5.2 追åŠ?
475 * ・BED ?šå?月ã?æœ?¾Œã?日付にセãƒ?ƒˆしますã?(先月月末)(5.5.5.2 追åŠ?
476 * ・ASD ?š翌月のæœ??の日付にセãƒ?ƒˆしますã?(翌月?‘日)(5.5.5.2 追åŠ?
477 * ・AED ?š翌月のæœ?¾Œã?日付にセãƒ?ƒˆしますã?(翌月月末)(5.5.5.2 追åŠ?
478 * ・数字:日を指定ã?åˆ?� けé?めますã?D1 ??DXXX の簡略系
479 *
480 * @og.rev 5.6.1.1 (2013/02/08) getDateFormat( String ,String ,String ) からåˆ?›¢ã€?
481 *
482 * @param now 基準となる日付ï¼?alendarオブジェクトï¼?
483 * @param prmB 処ç�?‚³マンãƒ?
484 *
485 */
486 public static final void calendarCalc( final Calendar now,final String prmB ) {
487
488 if( prmB != null ) {
489 if( "SD".equals( prmB ) ) { now.set( Calendar.DATE,1 ); }
490 else if( "ED".equals( prmB ) ) { now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) ); }
491 else if( "BSD".equals( prmB ) ) { // (先月?‘日)
492 now.roll( Calendar.MONTH,false ); now.set( Calendar.DATE,1 );
493 }
494 else if( "BED".equals( prmB ) ) { // (先月月末)
495 now.roll( Calendar.MONTH,false ); now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) );
496 }
497 else if( "ASD".equals( prmB ) ) { // (翌月?‘日)
498 now.roll( Calendar.MONTH,true ); now.set( Calendar.DATE,1 );
499 }
500 else if( "AED".equals( prmB ) ) { // (翌月月末)
501 now.roll( Calendar.MONTH,true ); now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) );
502 }
503 else if( "SW".equals( prmB ) ) {
504 // 日付型æ–?—å?入力データの開始日を月曜日にセãƒ?ƒˆしますã?
505 // SUNDAY=1 , MONDAY=2 になりますã?月曜日との差ã�?�‘、前に戻しますã?
506 // æŒ?®š日が日曜日の場合ã?、月曜日まで戻しますã?
507 int shu = now.get( Calendar.DAY_OF_WEEK ) - Calendar.MONDAY ;
508
509 if( shu > 0 ) { now.add( Calendar.DATE, -shu ); }
510 else if( shu < 0 ) { now.add( Calendar.DATE, -6 ); } // 日曜日の処ç�?
511
512 }
513 else if( "EW".equals( prmB ) ) {
514 // 日付型æ–?—å?入力データの終äº?—¥を日曜日にセãƒ?ƒˆしますã?
515 // SUNDAY=1 , MONDAY=2 になりますã?日曜日になるよã�?�«、å?に進めますã?
516 int shu = now.get( Calendar.DAY_OF_WEEK ) ;
517
518 if( shu != Calendar.SUNDAY ) { now.add( Calendar.DATE, 8-shu ); }
519 }
520 else if( prmB.startsWith( "D" ) && prmB.length() > 1 ) {
521 int day = Integer.parseInt( prmB.substring( 1 ) );
522 now.add( Calendar.DATE, day );
523 }
524 else if( prmB.startsWith( "M" ) && prmB.length() > 1 ) {
525 int month = Integer.parseInt( prmB.substring( 1 ) );
526 now.add( Calendar.MONTH , month );
527 }
528 else {
529 // 上記ã?パターン以外ã?、数字(日付)なので、変換できなければ、フォーマットエラー
530 try {
531 int day = Integer.parseInt( prmB );
532 now.add( Calendar.DATE, day );
533 }
534 catch( NumberFormatException ex ) {
535 String errMsg = "日付変数パラメータに、不正な値が指定されました。以下ã?中からæŒ?®šしなおしてくださいã€?
536 + "æŒ?®š可能?š[SD,ED,BSD,BED,ASD,AED,SW,EW,D1?žDXXX,M1?žMXXX]"
537 + " prmB=[" + prmB + "]" ;
538 throw new RuntimeException( errMsg,ex );
539 }
540 }
541 }
542 }
543
544 /**
545 * æŒ?®šã?引数の日付けæ–?—å?より、カレンãƒ?‚ªブジェクトを作æ?しますã?
546 * 引数は、数字以外ã?æ–?—を削除した状態に変換後ã?処ç�?�«回しますã?
547 * 不要なæ–?—を削除した状態でã€?¼˜文字以上になるよã�?�«æŒ?®šしてくださいã€?
548 * 例外的にã€?¼–文字ã?場合ã?、yyyyMM01 とみなしてã€?01" æ–?—å?を付与しますã?
549 * 引数に null を指定すると、現在時刻のカレンãƒ?‚’返しますã?
550 * それ以外ã?ãƒ??タでã€?¼˜ケタ以下ã?場合ã?、RuntimeException が発生しますã?
551 * ?˜ケタ以上14ケタ未æº??場合ã?ã€?¼˜ケタåˆ?‚’、年月日にåˆ?›¢したカレンãƒ?
552 * オブジェクトを作æ?しますã??‘4ケタ以上で初めて、時åˆ?§’を含ã‚?‚«レンãƒ?
553 * を作æ?しますã?
554 *
555 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
556 * @og.rev 5.5.8.2 (2012/11/09) value の判定に、null と ゼロæ–?—å?を判定するã?
557 *
558 * @param value 日付けæ–?—å?
559 *
560 * @return カレンãƒ?‚ªブジェクãƒ?引数がnullの場合ã?、現在時刻)
561 */
562 public static final Calendar getCalendar( final String value ) {
563 Calendar cal = Calendar.getInstance();
564
565 // if( value == null ) { return cal; }
566 if( value == null || value.isEmpty() ) { return cal; } // 5.5.8.2 (2012/11/09) null と ゼロæ–?—å?を判定するã?
567
568 // 日付表記に不要なæ–?—を削除しますã?
569 String dateStr = parseNumber( value ) ;
570
571 if( dateStr.length() == 6 ) { dateStr = dateStr + "01"; } // yyyyMM01 形式に無ç�?‚„り合わせるã?
572 else if( dateStr.length() < 8 ) {
573 String errMsg = "日付指定パラメータに、不正な値が指定されました。value=[" + value + "]" ;
574 throw new RuntimeException( errMsg );
575 }
576
577 cal.clear(); // 日付文字å?が存在するので、カレンãƒ?‚’リセãƒ?ƒˆ
578
579 int year = Integer.parseInt( dateStr.substring( 0,4 ) );
580 int month = Integer.parseInt( dateStr.substring( 4,6 ) ) - 1;
581 int date = Integer.parseInt( dateStr.substring( 6,8 ) );
582
583 int hour=0, minute=0, second=0;
584 if( dateStr.length() >= 14 ) {
585 hour = Integer.parseInt( dateStr.substring( 8,10 ) );
586 minute = Integer.parseInt( dateStr.substring( 10,12 ) );
587 second = Integer.parseInt( dateStr.substring( 12,14 ) );
588 }
589
590 cal.set( year,month,date,hour,minute,second );
591
592 return cal;
593 }
594
595 /**
596 * æŒ?®šã?引数の日付けæ–?—å?(yyyyMMdd)より、日付をåŠ?®—して返しますã?
597 * マイナスを与えると、減算しますã?
598 * 日付以上ã?精度のæ–?—å?を渡してもã?日付ã?みの計算となりますã?
599 * 結果は、引数の日付フォーマットとは全く別で、yyyyMMdd の?˜文字形式になりますã?
600 * 引数に null を渡すと、実行時の日付をベã?スとして処ç�?�—ますã?
601 *
602 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
603 *
604 * @param baseDate 日付けæ–?—å?(yyyyMMdd)
605 * @param plus åŠ?®—する日数(過去にするにはマイナス値を指定すã‚?
606 *
607 * @return 結果の日ä»?yyyyMMdd)
608 */
609 public static final String getDatePlus( final String baseDate,final int plus ) {
610 Calendar cal = getCalendar( baseDate );
611 cal.add( Calendar.DATE,plus );
612
613 return getDate( cal.getTimeInMillis() , "yyyyMMdd" );
614 }
615
616 /**
617 * 現在の月に、指定ã?月数をã?ラスした日付文字å?を返しますã?
618 * 日付文字å?のフォーマットã?ã€?yyyyMM" ですã?
619 * æŒ?®šする月数にマイナスを指定すると、減算できますã?
620 *
621 * @og.rev 5.5.7.2 (2012/10/09) 新規作æ?
622 *
623 * @param baseDate 日付けæ–?—å?(yyyyMM)
624 * @param plus åŠ?®—する月数(過去にするにはマイナス値を指定すã‚?
625 *
626 * @return æŒ?®šã?月数をã?ラスした日付文字å?(yyyyMM)
627 */
628 public static final String getMonthPlus( final String baseDate,final int plus ) {
629 Calendar cal = getCalendar( baseDate );
630 cal.set( Calendar.DATE, 1 ); // 当月の 1 日に設å®?
631 cal.add( Calendar.MONTH , plus );
632
633 return getDate( cal.getTimeInMillis() , "yyyyMM" );
634 }
635
636 /**
637 * æŒ?®šã?引数の日付けæ–?—å?(yyyyMMdd、yyyyMMddHHmmss)に、日付をåŠ?®—して返しますã?
638 * マイナスを与えると、減算しますã?
639 *
640 * æŒ?®šする日付には、単位を付与することが可能ですã?
641 * 単位ã?、yyyyMMddHHmmss 形式ã??‘文字をæŒ?®šしますã?大æ–?—ã?小文字も識別しますã?
642 * plus="5M" とすればã€?¼•か月ã?plus="5d" とすればã€?¼•日 追åŠ?�—ますã?
643 * plus に単位を付けなã�??合ã?、tani にæŒ?®šã?単位を使ã�?�¾すã?
644 * plus そã?もã?がã?null かã?isEmpty の場合ã?、加算ã?ã€? になりますã?
645 *
646 * baseDate æ–?—å?を日付文字å?に変換後ã?Calendar で計算し、結果をã?format 形式に変換しますã?
647 * 引数に null を渡すと、実行時の日付をベã?スとして処ç�?�—ますã?
648 *
649 * @og.rev 5.6.1.0 (2013/02/01) 新規作æ?
650 *
651 * @param baseDate 日付けæ–?—å?(yyyyMMdd、yyyyMMddHHmmss 形式ã?日付文字å?)
652 * @param plus åŠ?®—する日数(日付単位を含ã‚??単位ã?、y,M,d,H,m,s のæ–?—で、大æ–?—小文字ã?区別がありまã�?
653 * @param defTani 日付単位が未æŒ?®šã?場合ã?初期単ä½?'y','M','d','H','m','s' のどれか)
654 * @param format 返す日付文字å?のフォーマッãƒ?yyyyMMdd、yyyyMMddHHmmss)
655 *
656 * @return 結果の日ä»?yyyyMMdd)
657 * @throws NumberFormatException åŠ?®—する日数の単位が('y','M','d','H','m','s')以外ã?場合ã?
658 */
659 public static final String getDatePlus( final String baseDate,final String plus,final int defTani,final String format ) {
660
661 int addSu = 1; // 初期値(plus ã�?null ã‚?Empty の場合ã?ã€?¼‹1となã‚?
662 int tani = defTani;
663
664 if( plus != null && !plus.isEmpty() ) {
665 boolean flag = true; // 日付単位を持ってã�?‚‹かどã�?�‹。持ってã�?‚‹場合ã?、true
666 char ch = plus.charAt( plus.length()-1 ); // æœ?¾Œã?ä¸?–‡字を取å¾?単位か、数字本ä½?
667 switch( ch ) {
668 case 'y' : tani = Calendar.YEAR; break ;
669 case 'M' : tani = Calendar.MONTH; break ;
670 case 'd' : tani = Calendar.DATE; break ;
671 case 'H' : tani = Calendar.HOUR_OF_DAY; break ;
672 case 'm' : tani = Calendar.MINUTE; break ;
673 case 's' : tani = Calendar.SECOND; break ;
674 default : flag = false; break ; // 日付単位を持ってã�?�ªã�??
675 }
676 if( flag ) {
677 addSu = Integer.parseInt( plus.substring( 0,plus.length()-1 ) ); // 日付単ä½?あり
678 }
679 else {
680 addSu = Integer.parseInt( plus ) ; // 日付単ä½?なã�?
681 }
682 }
683
684 Calendar cal = getCalendar( baseDate );
685 cal.add( tani,addSu );
686
687 return getDate( cal.getTimeInMillis() , format );
688 }
689 }