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             * æ¡æ•°ã¯ã€?¼˜æ¡?ã¾ãŸã?ã€?¼‘ï¼”æ¡ä»¥å¤–ã?å ´åˆã?ã€å¤‰æ›ã‚¨ãƒ©ãƒ¼ã¨ã—ã¾ã™ã?
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æ¡?ã¾ãŸã?ã€?¼‘ï¼”æ¡ã§æŒ?®šã—ã¦ãã ã•ã„ã€?
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?ˆï¼’月?“ï¼æ—¥?‰ãªã©ã®æ—¥ä»˜ã‚„ã€?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ã€???šï¼˜æ–‡å­—ã?日付データ(yyyyMMdd)を扱ã?¾ã™ã?
321             * ・Y2MDã€??šï¼–文字ã?日付データ(yyMMdd)を扱ã?¾ã™ã?
322             * ・YMã€?? ?šï¼–文字ã?日付データ(yyyyMM)を扱ã?¾ã™ã?
323             * ・MDã€?? ?šï¼”文字ã?日付データ(MMdd)を扱ã?¾ã™ã?(5.5.5.2 追åŠ?
324             * ・HMSã€???šï¼–文字ã?時刻ãƒ??ã‚¿(HHmmss)を扱ã?¾ã™ã?
325             * ・YMDHMS ?šï¼‘4文字ã?日付データ(yyyyMMddHHmmss)を扱ã?¾ã™ã?
326             * ・EEEã€???šæ›œæ—¥ã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ­ã‚±ãƒ¼ãƒ«(EEE)ã§è¡¨ç¤ºã—ã¾ã™ã?
327             *
328             * F付ãã¯ã€ãƒ•ォーマットã•ã‚ŒãŸæ—¥ä»˜ã‚’è¿”ã—ã¾ã™ã?
329             * ・YMDFã€??šï¼‘ï¼æ–‡å­—ã?日付表ç¾(yyyy/MM/dd)を扱ã?¾ã™ã?
330             * ・Y2MDFã€?¼šï¼˜æ–‡å­—ã?日付表ç¾(yy/MM/dd)を扱ã?¾ã™ã?
331             * ・YMFã€???šï¼—文字ã?日付表ç¾(yyyy/MM)を扱ã?¾ã™ã?
332             * ・HMSFã€??šï¼˜æ–‡å­—ã?時刻表ç¾(HH:mm:ss)を扱ã?¾ã™ã?
333             * ・YMDHMSF?šï¼‘9文字ã?日付表ç¾(yyyy/MM/dd HH:mm:ss)を扱ã?¾ã™ã?
334             * ・MDFã€???šï¼•文字ã?月日表ç¾(MM/dd)を扱ã?¾ã™ã?
335             * ・MDEFã€??šï¼•æ–‡å­—ï¼‹æ›œæ—¥ã®æœˆæ—¥è¡¨ç¾(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ãªã‚‰ï¼‘時間後ã?H24 ãªã‚‰ï¼’4時間å¾?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             * ?˜ã‚±ã‚¿ä»¥ä¸Šï¼‘4ケタ未æº??å ´åˆã?ã€?¼˜ã‚±ã‚¿åˆ?‚’ã€å¹´æœˆæ—¥ã«åˆ?›¢ã—ãŸã‚«ãƒ¬ãƒ³ãƒ?
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 ã®å ´åˆã?ã€?¼‹ï¼‘ã¨ãªã‚?
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    }