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             * ã“れã¯ã€å?部ã§ã€parseNumber(String) 処ç?«ã‚ˆã‚Šã€ä¸è¦ãªãƒ•ォーマット記å·ã‚’削除ã—ã¾ã™ã?
196             * ã“ã“ã§ã¯ã€åŸºæœ¬çš?«ã¯ã€?¼–文字ï¼?yyyMM?‰ã??˜æ–‡å­—ï¼?yyyMMdd?‰ã??‘4文字ï¼?yyyMMddHHmmss??
197             * ã®æ—¥ä»˜æ–‡å­—å?を作æ?ã™ã‚‹ã“ã¨ã‚’想定ã—ã¦ã?¾ã™ãŒã€æŒ‡å®šã?æ¡æ•°ä»¥å¤–ã?ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã?
198             * 
199             * 引数ãŒã?null         â‡?æ¡æ•°ã«ç„¡é–¢ä¿‚ã«ã€ç©ºæ–?­—å?ã‚’è¿”ã™ã€?
200             * å¼•æ•°ã®æ¡æ•°ãŒä¸??     â‡?ãã?値を返ã™ã€?
201             * å¼•æ•°ã®æ¡æ•°ãŒä¸ä¸??   â‡?エラー
202             * ãŸã ã—ã?å¼•æ•°ã®æœ?¤§é•·ã¯ã€?¼‘4ケタã«åˆ¶é™ã—ã¦ã?¾ã™ã?
203             * 
204             * ã“ã?メソãƒ?ƒ‰ã§ã¯ã€æ—¥ä»˜ã¨ã—ã¦æˆç«‹ã—ã¦ã?‚‹ã‹ã©ã?‹??9999999ãªã©?‰ã?判定ã—ã¦ã?¾ã›ã‚“ã€?
205             *
206             * @og.rev 5.6.6.0 (2013/07/05) メソãƒ?ƒ‰ã®å†?®¹ã‚’ç§»ã™ã?
207             *
208             * @param       value   ä»»æ„ã?æ—¥ä»˜ã‘æ–?­—å?
209             * @param       size    変æ›ã—ãŸã?¡æ•°
210             *
211             * @return      æ•°å­—ã ã‘ã§æ§‹æ?ã•れる文字å??ˆä¾‹ï¼?0010417154822??nullã¯ã‚¼ãƒ­æ–?­—å?ã‚’è¿”ã—ã¾ã?
212             */
213            public static final String parseDate( final String value , final int size ) {
214                    return parseDate( value , size , size );                // æœ?°ã¨æœ?¤§ã‚’åŒã˜å?ã«ã™ã‚‹ã€?
215            }
216    
217            /**
218             * 日付文字å?ã®æ¡æ•°ã®æ•´åˆæ?ã‚’å–りã¾ã™ã?
219             * ã“れã¯ã€å?部ã§ã€parseNumber(String) 処ç?«ã‚ˆã‚Šã€ä¸è¦ãªãƒ•ォーマット記å·ã‚’削除ã—ã¾ã™ã?
220             * ã“ã“ã§ã¯ã€åŸºæœ¬çš?«ã¯ã€?¼–文字ï¼?yyyMM?‰ã??˜æ–‡å­—ï¼?yyyMMdd?‰ã??‘4文字ï¼?yyyMMddHHmmss??
221             * ã®æ—¥ä»˜æ–‡å­—å?を作æ?ã™ã‚‹ã“ã¨ã‚’想定ã—ã¦ã?¾ã™ãŒã€ãれ以外ã?æ¡æ•°ã§ã‚‚下記ã?ルールã«å¾“ã£ã¦
222             * 処ç?•れã¾ã™ã?
223             * 
224             * 引数ãŒã?null         â‡?æ¡æ•°ã«ç„¡é–¢ä¿‚ã«ã€ç©ºæ–?­—å?ã‚’è¿”ã™ã€?
225             * å¼•æ•°ã®æ¡æ•°ãŒç¯?›²å†?  â‡?以下ã?処ç?‚’実行ã™ã‚‹ã?
226             * å¼•æ•°ã®æ¡æ•°ã‚’åŒã?    â‡?ãã?ã¾ã¾è¿”ã™ã€?
227             * å¼•æ•°ã®æ¡æ•°ã‚ˆã‚Šå¤§ãã„ â‡?余をカãƒ?ƒˆã—ã¦ã€å¼•æ•°ã®æœ?¤§é•·ã«ãã‚ãˆã‚‹ã€?
228             * å¼•æ•°ã®æ¡æ•°ã«è¶³ã‚Šãªã?â‡?"20000101000000" ã®æ–?­—å?ã®éƒ¨åˆ?–‡å­—å?ã‚’çµåˆã•ã›ã¦ã€å¼•æ•°ã®æœ?¤§é•·ã«ãã‚ãˆã‚‹ã€?
229             * ãŸã ã—ã?å¼•æ•°ã®æœ?¤§é•·ã¯ã€?¼‘4ケタã«åˆ¶é™ã—ã¦ã?¾ã™ã?
230             * 
231             * ã“ã?メソãƒ?ƒ‰ã§ã¯ã€æ—¥ä»˜ã¨ã—ã¦æˆç«‹ã—ã¦ã?‚‹ã‹ã©ã?‹??9999999ãªã©?‰ã?判定ã—ã¦ã?¾ã›ã‚“ã€?
232             *
233             * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæ?
234             * @og.rev 5.6.1.1 (2013/02/08) æ¡æ•°ãƒã‚§ãƒ?‚¯å°Žå?。6æ¡ä»¥ä¸‹ã ã¨ã‚¨ãƒ©ãƒ¼ã«ã™ã‚‹ã€?
235             * @og.rev 5.6.6.0 (2013/07/05) æ¡æ•°ãƒã‚§ãƒ?‚¯ã®æœ?°?æœ?¤§æŒ?®?
236             *
237             * @param       value   ä»»æ„ã?æ—¥ä»˜ã‘æ–?­—å?
238             * @param       minSize 変æ›ã—ãŸã?¡æ•°ã®æœ?°å?
239             * @param       maxSize 変æ›ã—ãŸã?¡æ•°ã®æœ?¤§å€¤
240             *
241             * @return      æ•°å­—ã ã‘ã§æ§‹æ?ã•れる文字å??ˆä¾‹ï¼?0010417154822??nullã¯ã‚¼ãƒ­æ–?­—å?ã‚’è¿”ã—ã¾ã?
242             */
243    //      public static final String parseDate( final String value , final int size ) {
244            public static final String parseDate( final String value , final int minSize , final int maxSize ) {
245                    if( value == null ) { return ""; }
246    
247                    String rtn = parseNumber( value );
248    
249                    // å¼•æ•°ã®æœ?¤§é•·ã¯ã€?¼‘4ケタã«åˆ¶é™ã—ã¦ã?¾ã™ã?
250                    if( maxSize > 14 ) {
251                            String errMsg = "日付登録ã«è¨±å¯ã§ãã‚‹æœ?¤§æ¡æ•°ã¯ã€?¼‘4ケタã§ã™ã?"
252                                                    + " maxSize=[" + maxSize + "]" ;
253                            throw new RuntimeException( errMsg );
254                    }
255    
256    //              int maxSize = ( size > 14 ) ? 14 : size ;            // å…ˆã«æœ?¤§ã‚µã‚¤ã‚ºã‚’求ã‚ã¦ãŠã
257                    int len     = rtn.length() ;
258    
259                    if(      len == maxSize ) { rtn = value; }
260    //              else if( len >  maxSize ) { rtn = rtn.substring( 0,maxSize ); }
261                    // 5.6.1.1 (2013/02/08) æ¡æ•°ãƒã‚§ãƒ?‚¯å°Žå?。6æ¡ä»¥ä¸‹ã ã¨ã‚¨ãƒ©ãƒ¼ã«ã™ã‚‹ã€?
262    //              else if( len < 6 ) {
263                    // 5.6.6.0 (2013/07/05) æ¡æ•°ãƒã‚§ãƒ?‚¯ã®æœ?°?æœ?¤§æŒ?®šã§ã€ç¯?›²å¤–ã?エラー
264                    else if( len < minSize || len > maxSize ) {
265                            String errMsg = "日付文字å?ã«ã€ä¸æ­£ãªå€¤ãŒæŒ‡å®šã•れã¾ã—ãŸã€‚最å°["
266                                                    + minSize + "] ã‹ã‚‰ã€æœ€å¤§[" + maxSize + "]ã®ç¯?›²ã§æŒ?®šã—ã¦ãã ã•ã„ã€?
267                                                    + " value=[" + value + "]" ;
268                            throw new RuntimeException( errMsg );
269                    }
270                    else {
271                            rtn = rtn + "20000101000000".substring( len,maxSize ) ; // 中間文字å?を加ãˆã‚‹ã€?
272                    }
273    
274                    return rtn ;
275            }
276    
277            /**
278             * 日付文字å?ã®å޳å¯?ªæ•´åˆæ?ãƒã‚§ãƒ?‚¯ã‚’行ã„ã¾ã™ã?
279             * ã“ã“ã§æŒ?®šã§ãã‚‹ã®ã¯ã€?¼˜æ–‡å­—ï¼?yyyMMdd?‰ã??‘4文字ï¼?yyyMMddHHmmss?‰ã?ã©ã¡ã‚‰ã‹ã®
280             * æ•°å­—ã ã‘ã?日付文字å?ã§ã‚りã€ãれãŒã€æ—¥ä»˜ã¨ã—ã¦æ­£ã—ã„ã‹ã©ã?‹ã®ãƒã‚§ãƒ?‚¯ã‚’行ã„ã¾ã™ã?
281             * æ­£ã—ã‘れã?ã€true ã‚’ã?é–“é•ã£ã¦ã?‚Œã°ã€false ã‚’è¿”ã—ã¾ã™ã?
282             * ã“ã“ã§ã¯ã€?0120230?ˆï¼’月?“ï¼æ—¥?‰ãªã©ã®æ—¥ä»˜ã‚„ã€?0120101235960 ãªã©ã‚?false ã«ãªã‚Šã¾ã™ã?
283             * 引数ãŒã?null ãŠã‚ˆã³ã€ç©ºæ–?­—å?ã®å ´åˆã‚‚ã€false ã‚’è¿”ã—ã¾ã™ã?ã§ã€?¿ã‘ãŸã??åˆã?ã€äº‹å‰ã«
284             * 判定ã—ã¦ãŠã„ã¦ãã ã•ã„ã€?
285             *
286             * å†?ƒ¨å‡¦ç?¨ã—ã¦ã¯ã€DateFormat ã§ã€setLenient( false ) を設定ã™ã‚‹ã“ã¨ã§ã€?
287             * æ—¥ä»?時刻解æžã‚’厳å¯?«è§£æžã™ã‚‹ã«ã—ã¦ã€ParseException ãŒç™ºç”Ÿã—ãªã?‹ã©ã?‹åˆ¤å®šã—ã¦ã?¾ã™ã?
288             *
289             * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæ?
290             *
291             * @param       value  æ•°å­—ã ã‘ã§æ§‹æ?ã•ã‚Œã‚‹æ—¥ä»˜ã‘æ–?­—å?
292             *
293             * @return      true:日付ã¨ã—ã¦æ­£ã—ã„å ´å?false:日付ã¨ã—ã¦é–“é•ã£ã¦ã?‚‹å ´å?
294             */
295            public static final boolean isStrict( final String value ) {
296                    if( value == null || ( value.length() != 8 && value.length() != 14 ) ) { return false; }
297    
298                    // 日付ã?厳å¯?ªãƒã‚§ãƒ?‚¯
299                    String form = (value.length() == 8) ? "yyyyMMdd" : "yyyyMMddHHmmss" ;
300                    DateFormat formatter = new SimpleDateFormat( form,Locale.JAPAN );
301                    formatter.setLenient( false );          // æ—¥ä»?時刻解æžã‚’厳å¯?«è¡Œã†(false=厳å¯?
302    
303                    boolean flag ;
304                    try {
305                            formatter.parse( value );
306                            flag = true;
307                    }
308                    catch( ParseException ex ) {
309                            flag = false;
310                    }
311    
312                    return flag;
313            }
314    
315            /**
316             * 日付関係ã?æƒ??を簡易的ã«å‡¦ç?—ã¾ã™ã?
317             *
318             * CC引数ã®åŠ?¸›ç®—パラメータã¯ã€? ã§ã™ã?
319             *
320             * @og.rev 5.7.4.1 (2014/03/14) CC 引数を拡張ã™ã‚‹ãŸã‚ã€æ—§ãƒ¡ã‚½ãƒ?ƒ‰ã‚’å?ç¾ã—ã¦ãŠãã¾ã™ã?
321             *
322             * @param   key         フォーマットã?予ç´?ª?
323             * @param   prmA        基準ã¨ãªã‚‹æ—¥ä»?nullã®å ´åˆã?ã€å?ç?™‚刻)
324             * @param   prmB        処ç?‚³ãƒžãƒ³ãƒ?
325             *
326             * @return   メãƒ?‚»ãƒ¼ã‚¸æƒ??
327             * @see         #getDateFormat( String , String ,String , int )
328             */
329            public static final String getDateFormat( final String key ,final String prmA ,final String prmB ) {
330                    return getDateFormat( key,prmA,prmB,0 );
331            }
332    
333            /**
334             * 日付関係ã?æƒ??を簡易的ã«å‡¦ç?—ã¾ã™ã?
335             *
336             * 第ä¸?¼•æ•° "XXXX" ã¯ã€æ—¥ä»˜å?ç?‚’行ã†ãƒ•ォーマットã?予ç´?ªžã«ãªã£ã¦ã?¾ã™ã?
337             * ・YMDã€???šï¼˜æ–‡å­—ã?4-2-2年月日ãƒ??ã‚¿(yyyyMMdd)を扱ã?¾ã™ã?
338             * ・Y2MDã€??šï¼–文字ã?2-2-2年月日ãƒ??ã‚¿(yyMMdd)を扱ã?¾ã™ã?
339             * ・YMã€?? ?šï¼–文字ã?4-2年月データ(yyyyMM)を扱ã?¾ã™ã?
340             * ・HMSã€???šï¼–文字ã?2-2-2時å?秒データ(HHmmss)を扱ã?¾ã™ã?
341             * ・YMDHMS ?šï¼‘4文字ã?4-2-2-2-2-2年月日時å?秒データ(yyyyMMddHHmmss)を扱ã?¾ã™ã?
342             * ・EEEã€???šæ›œæ—¥ã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ­ã‚±ãƒ¼ãƒ«ã§è¡¨ç¤ºã—ã¾ã™ã?
343             *
344             * F付ãã¯ã€ãƒ•ォーマットã•ã‚ŒãŸæ—¥ä»˜ã‚’è¿”ã—ã¾ã™ã?
345             * ・YMDFã€??šï¼‘ï¼æ–‡å­—ã?日付表ç¾(yyyy/MM/dd)を扱ã?¾ã™ã?
346             * ・Y2MDFã€?¼šï¼˜æ–‡å­—ã?日付表ç¾(yy/MM/dd)を扱ã?¾ã™ã?
347             * ・YMFã€???šï¼—文字ã?日付表ç¾(yyyy/MM)を扱ã?¾ã™ã?
348             * ・HMSFã€??šï¼˜æ–‡å­—ã?時刻表ç¾(HH:mm:ss)を扱ã?¾ã™ã?
349             * ・YMDHMSF?šï¼‘9文字ã?日付表ç¾(yyyy/MM/dd HH:mm:ss)を扱ã?¾ã™ã?
350             * ・MDFã€???šï¼•文字ã?月日表ç¾(MM/dd)を扱ã?¾ã™ã?
351             * ・MDEFã€??šï¼•æ–‡å­—ï¼‹æ›œæ—¥ã®æœˆæ—¥è¡¨ç¾(MM/dd(EEE))を扱ã?¾ã™ã?
352             * ・MD2Fã€??šå’Œæš¦ã®æœˆæ—¥è¡¨ç¾(MMæœ?dæ—¥)を扱ã?¾ã™ã?(5.5.5.2 追åŠ?
353             * ・GYMDFã€?¼šå’Œæš¦ã®å¹´æœˆæ—¥è¡¨ç¾(GGGGyyyyå¹´MMæœ?dæ—¥)を扱ã?¾ã™ã?
354             * ・G2YMDF ?šå’Œæš¦ã®æ—¥ä»˜è¡¨ç¾(Gyyyy/MM/dd)を扱ã?¾ã™ã?
355             * ・GYMFã€??šå’Œæš¦ã®å¹´æœˆè¡¨ç¾(GGGGyyyyå¹´MMæœ?を扱ã?¾ã™ã?
356             * ・GYFã€???šå’Œæš¦ã®å¹´è¡¨ç¾(GGGGyyyy)を扱ã?¾ã™ã?
357             *
358             * ãªãŠã?上記以外ã?フォーマットをæŒ?®šã™ã‚‹å?åˆã?ã€XXXX部åˆ?«ç›´æŽ¥è¨˜è¿°ã§ãã¾ã™ã?(5.5.5.2 追åŠ?
359             * ãŸã ã—ã?基本çš?«ã¯ã€è?由フォーマットã?ã€ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒ?‚¯ãŒãªã?‚ºã€ä½¿ã‚ãªã?§ãã ã•ã„ã€?
360             *
361             * 第二引数 AA ã¯ã€åŸºæº–ã¨ãªã‚‹æ—¥ä»˜ã‚’ã€yyyyMMddå½¢å¼ã§æŒ?®šã—ã¾ã™ã?nullã®å ´åˆã?ã€ç¾åœ¨æ™‚刻を使用ã—ã¾ã™ã?
362             * æŒ?®šã§ãる日付ã?ã€yyyyMMddå½¢å¼ã‚’推奨ã—ã¾ã™ãŒã€?/' , '-' , ' ' , ':' を削除ã—ã¦ä½¿ã?¾ã™ã?
363             * ?–æ¡ã?å ´åˆã?ã€yyyyMM + 01 ã¨ã—ã??˜ã‚±ã‚¿ã®å ´åˆã?ã€yyyyMMdd ã¨ã—ã?14ケタ以上ã?å ´åˆã?ã€å‰åŠï¼‘4文字を
364             * yyyyMMddHHmmss ã¨ã—ã¦å‡¦ç?—ã¾ã™ã?ãれ以外ã?æ¡æ•°ã®å ´åˆã?ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã?
365             * ãŸã¨ãˆã?ã€?2012/09/05 16:52:36" ã®ã‚ˆã†ãªãƒ•ォーマットデータã®å ´åˆã?'/' , '-' , ' ' , ':' を削除ã—ã¦
366             * "20120905165236" ã«å¤‰æ›å¾Œã?日付オブジェクトã«å¤‰æ›ã•れã¾ã™ã?
367             *
368             * 第三引数 BB ã¯ã€æ—¥ä»˜ã«ã¤ã?¦ã®åŠ?¸›ç®—å?ç?‚’行ã†ãŸã‚ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’æŒ?®šã—ã¾ã™ã?
369             * nullã®å ´åˆã?ã€ãªã«ã‚‚加減算å?ç?‚’行ã„ã¾ã›ã‚“ã€?
370             * ・SD ?šå½“æœˆã®æœ??ã®æ—¥ä»˜ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(当月?‘æ—¥)ã€?C引数ã¯ã€?N:N月å‰ã€?:当月(=SD)ã€N:N月後ã?-1:BSD ã¨åŒã˜ã€?:ASD ã¨åŒã˜
371             * ・ED ?šå½“æœˆã®æœ?¾Œã?日付ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(当月月末)ã€?C引数ã¯ã€?N:N月å‰ã€?:当月(=ED)ã€N:N月後ã?-1:BED ã¨åŒã˜ã€?:AED ã¨åŒã˜
372             * ・SW ?šæ—¥ä»˜å?ç??週åˆã‚(月曜日)ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?日付ã?当日よりå‰ã«ç§»å‹•ã—ã¾ã™ã?CC引数ã¯ã€?N:N週å‰ã?0:今é?(=SW)ã€N:N週å¾?
373             * ・EW ?šæ—¥ä»˜å?ç??週末(日曜日)ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?日付ã?当日より後ã‚ã«ç§»å‹•ã—ã¾ã™ã?CC引数ã¯ã€?N:N週å‰ã?0:今é?(=EW)ã€N:N週å¾?
374             * ・H1 ??HXXX ?šæ™‚ã‚’æŒ‡å®šã?åˆ? ã‘é?ã‚ã¾ã™ã?H1ãªã‚‰ï¼‘時間後ã?H24 ãªã‚‰ï¼’4時間å¾?5.5.5.6 (2012/08/31) 追åŠ?
375             * ・D1 ??DXXX ?šæ—¥ã‚’æŒ‡å®šã?åˆ? ã‘é?ã‚ã¾ã™ã?D1ãªã‚‰ç¿Œæ—¥ã€D200 ãªã‚?00æ—¥å¾?
376             * ・M1 ??MXXX ?šæœˆã‚’æŒ‡å®šã?åˆ? ã‘é?ã‚ã¾ã™ã?M1ãªã‚‰ç¿Œæœˆã€M6 ãªã‚‰åŠå¹´å¾?
377             * ・BSD ??有閑)å…ˆæœˆã®æœ??ã®æ—¥ä»˜ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(先月?‘æ—¥)(5.5.5.2 追åŠ?。SD -1 ã¨åŒç­?
378             * ・BED ??有閑)å…ˆæœˆã®æœ?¾Œã?日付ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(先月月末)(5.5.5.2 追åŠ?ã€?D -1 ã¨åŒç­?
379             * ・ASD ??有閑)ç¿Œæœˆã®æœ??ã®æ—¥ä»˜ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(翌月?‘æ—¥)(5.5.5.2 追åŠ?。SD 1  ã¨åŒç­?
380             * ・AED ??有閑)ç¿Œæœˆã®æœ?¾Œã?日付ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(翌月月末)(5.5.5.2 追åŠ?ã€?D 1  ã¨åŒç­?
381             *
382             * CC 引数ã¯ã€ç‰¹åˆ¥ãªå‡¦ç?§ã€BB 引数ã«å¯¾ã—ã¦ã€åŠ ç®—ã?減算ã?ãŸã‚ã®æ•°å­—ã‚’æŒ?®šã§ãã¾ã™ã?(5.7.4.1 (2014/03/14) 追åŠ?
383             * 従æ¥ã¯ã€BB 引数ãŒã?"H" , "D" , "M" ã® ?‘文字パラメータã®å ´åˆã?ã¿åˆ©ç”¨å¯èƒ½ã§ã—ãŸã€?
384             *
385             * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæ?
386             * @og.rev 5.6.1.1 (2013/02/08) prmB処ç?‚’ã€calendarCalc メソãƒ?ƒ‰ã¸ç§»å‹?
387             * @og.rev 5.7.4.1 (2014/03/14) CC 引数を拡張
388             *
389             * @param   key         フォーマットã?予ç´?ª?
390             * @param   prmA        基準ã¨ãªã‚‹æ—¥ä»?nullã®å ´åˆã?ã€å?ç?™‚刻)
391             * @param   prmB        処ç?‚³ãƒžãƒ³ãƒ?
392             * @param   intC        åŠ?¸›ç®—å?ç?‚’行ã†ãŸã‚ã®æ•°å­—ã?0 ã¯ã€BB引数ã®å¾“æ¥è¨ˆç®—ã?ã¾ã¾ã€?
393             *
394             * @return   メãƒ?‚»ãƒ¼ã‚¸æƒ??
395             * @see         #getDateFormat( String , String ,String )
396             * @see         #getCalendar( String )                                          AA 引数 ã‹ã‚‰ã‚«ãƒ¬ãƒ³ãƒ?‚ªãƒ–ジェクトを作æ?ã—ã¾ã™ã?
397             * @see         #calendarCalc( Calendar , String , int )        BB 引数ã€CC 引数をå?ã«ã€æ—¥ä»˜è¨ˆç®—ã—ã¾ã™ã?
398             */
399            public static final String getDateFormat( final String key ,final String prmA ,final String prmB ,final int intC ) {
400    
401                    // prmA ã?null ã®å ´åˆã?ã€ãã®ã¾ã¾ã€ç¾åœ¨æ™‚刻ãŒä½¿ã‚れã¾ã™ã?
402                    Calendar now = getCalendar( prmA );
403    
404                    // 5.6.1.1 (2013/02/08) getDateFormat( String ,String ,String ) ã‹ã‚‰åˆ?›¢ã€?
405    //              calendarCalc( now,prmB );
406                    calendarCalc( now,prmB,intC );          // 5.7.4.1 (2014/03/14) CC 引数を拡張
407    
408                    String format = DATE_FORMAT.get( key );
409                    if( format == null ) {
410                            // DATE_FORMAT ã«å­˜åœ¨ã—ãªã?ƒ•ォーマットをæŒ?®šã—ã¦ã‚‚ã?エラーã«ã—ã¾ã›ã‚“ã€?
411                            // ãŸã ã—ã?後å?ç?§ãƒ•ォーマットエラーã«ãªã‚‹å¯èƒ½æ€§ã¯æ®‹ã‚Šã¾ã™ã?
412                            format = key;   // 5.5.5.2 (2012/08/18) 自由フォーマット指�
413                    }
414    
415                    //5.5.0.2 å…ˆé?Gã®å ´åˆã?和暦ãªã®ã§formatterã®Localeを変更ã™ã‚‹
416                    DateFormat formatter = null;
417                    if( key.indexOf('G') == 0 ){
418                            formatter = new SimpleDateFormat( format, new Locale("ja","JP","JP"));
419                    }
420                    else{
421                            formatter = new SimpleDateFormat( format,Locale.JAPAN );
422                    }
423    
424                    return formatter.format( now.getTime() );
425            }
426    
427            /**
428             * é–‹å§‹å‰è¨­å®šå?ã€ã¾ãŸã? 終äº?¾Œè¨­å®šå?ã®æ–?­—å?ã‹ã‚‰ã€ã‚ªãƒ—ションæ–?­—å?ã‚’åˆæˆã—ã¾ã™ã?
429             * 基準ã¨ãªã‚‹æ—¥ä»˜ã«è¨ˆç®—ã—ãŸçµæžœã‚’åæ˜?•ã›ã¾ã™ã?
430             *
431             * CC引数ã®åŠ?¸›ç®—パラメータã¯ã€? ã§ã™ã?
432             *
433             * @og.rev 5.7.4.1 (2014/03/14) CC 引数を拡張ã™ã‚‹ãŸã‚ã€æ—§ãƒ¡ã‚½ãƒ?ƒ‰ã‚’å?ç¾ã—ã¦ãŠãã¾ã™ã?
434             *
435             * @param   now     基準ã¨ãªã‚‹æ—¥ä»˜ï¼?alendarオブジェクトï¼?
436             * @param   prmB        処ç?‚³ãƒžãƒ³ãƒ?
437             */
438            public static final void calendarCalc( final Calendar now,final String prmB ) {
439                    calendarCalc( now,prmB,0 );
440            }
441    
442            /**
443             * é–‹å§‹å‰è¨­å®šå?ã€ã¾ãŸã? 終äº?¾Œè¨­å®šå?ã®æ–?­—å?ã‹ã‚‰ã€ã‚ªãƒ—ションæ–?­—å?ã‚’åˆæˆã—ã¾ã™ã?
444             * 基準ã¨ãªã‚‹æ—¥ä»˜ã«è¨ˆç®—ã—ãŸçµæžœã‚’åæ˜?•ã›ã¾ã™ã?
445             *
446             * prmB ã¯ã€æ—¥ä»˜ã«ã¤ã?¦ã®åŠ?¸›ç®—å?ç?‚’行ã†ãŸã‚ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’æŒ?®šã—ã¾ã™ã?
447             * ・SD ?šå½“æœˆã®æœ??ã®æ—¥ä»˜ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(当月?‘æ—¥)ã€?C引数ã¯ã€?N:N月å‰ã€?:当月(=SD)ã€N:N月後ã?-1:BSD ã¨åŒã˜ã€?:ASD ã¨åŒã˜
448             * ・ED ?šå½“æœˆã®æœ?¾Œã?日付ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(当月月末)ã€?C引数ã¯ã€?N:N月å‰ã€?:当月(=ED)ã€N:N月後ã?-1:BED ã¨åŒã˜ã€?:AED ã¨åŒã˜
449             * ・SW ?šæ—¥ä»˜å?ç??週åˆã‚(月曜日)ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?日付ã?当日よりå‰ã«ç§»å‹•ã—ã¾ã™ã?CC引数ã¯ã€?N:N週å‰ã?0:今é?(=SW)ã€N:N週å¾?
450             * ・EW ?šæ—¥ä»˜å?ç??週末(日曜日)ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?日付ã?当日より後ã‚ã«ç§»å‹•ã—ã¾ã™ã?CC引数ã¯ã€?N:N週å‰ã?0:今é?(=EW)ã€N:N週å¾?
451             * ・H1 ??HXXX ?šæ™‚ã‚’æŒ‡å®šã?åˆ? ã‘é?ã‚ã¾ã™ã?H1ãªã‚‰ï¼‘時間後ã?H24 ãªã‚‰ï¼’4時間å¾?5.5.5.6 (2012/08/31) 追åŠ?
452             * ・D1 ??DXXX ?šæ—¥ã‚’æŒ‡å®šã?åˆ? ã‘é?ã‚ã¾ã™ã?D1ãªã‚‰ç¿Œæ—¥ã€D200 ãªã‚?00æ—¥å¾?
453             * ・M1 ??MXXX ?šæœˆã‚’æŒ‡å®šã?åˆ? ã‘é?ã‚ã¾ã™ã?M1ãªã‚‰ç¿Œæœˆã€M6 ãªã‚‰åŠå¹´å¾?
454             * ・BSD ?šå?月ã?æœ??ã®æ—¥ä»˜ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(先月?‘æ—¥)(5.5.5.2 追åŠ?。SD-1 ã¨åŒç­?
455             * ・BED ?šå?月ã?æœ?¾Œã?日付ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(先月月末)(5.5.5.2 追åŠ?ã€?D-1 ã¨åŒç­?
456             * ・ASD ?šç¿Œæœˆã®æœ??ã®æ—¥ä»˜ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(翌月?‘æ—¥)(5.5.5.2 追åŠ?。SD1  ã¨åŒç­?
457             * ・AED ?šç¿Œæœˆã®æœ?¾Œã?日付ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?(翌月月末)(5.5.5.2 追åŠ?ã€?D1  ã¨åŒç­?
458             * ・数字:日を指定ã?åˆ? ã‘é?ã‚ã¾ã™ã?D1 ??DXXX ã®ç°¡ç•¥ç³»
459             *
460             * CC 引数ã¯ã€ç‰¹åˆ¥ãªå‡¦ç?§ã€BB 引数ã«å¯¾ã—ã¦ã€åŠ ç®—ã?減算ã?ãŸã‚ã®æ•°å­—ã‚’æŒ?®šã§ãã¾ã™ã?(5.7.4.1 (2014/03/14) 追åŠ?
461             * HXXX,DXXX,MXXX å½¢å¼ã«ã€CC 引数を付ã‘ãŸå?åˆã?ã€XXX ã«ã•らã«åŠ?®—ã•れã¾ã™ã?
462             * prmB ã«ã€æ•°å­—を使用ã—ãŸå ´åˆã?(コマンドã§ãªã??å?ã«ã‚‚ã?CC 引数ã¯ã€åŠ ç®—ã•れã¾ã™ã?
463             *
464             * @og.rev 5.6.1.1 (2013/02/08) getDateFormat( String ,String ,String ) ã‹ã‚‰åˆ?›¢ã€?
465             * @og.rev 5.7.4.1 (2014/03/14) H1 ??HXXX ?šæ™‚ã‚’æŒ‡å®šã?åˆ? ã‘é?ã‚る処ç?Œå®Ÿè£?•れã¦ã?ªã‹ã£ãŸã?
466             * @og.rev 5.7.4.1 (2014/03/14) CC 引数追�
467             *
468             * @param   now     基準ã¨ãªã‚‹æ—¥ä»˜ï¼?alendarオブジェクトï¼?
469             * @param   prmB        処ç?‚³ãƒžãƒ³ãƒ?
470             * @param   intC        åŠ?¸›ç®—å?ç?‚’行ã†ãŸã‚ã®æ•°å­—ã?0 ã¯ã€BB引数ã®å¾“æ¥è¨ˆç®—ã?ã¾ã¾ã€?
471             */
472            public static final void calendarCalc( final Calendar now , final String prmB , final int intC ) {
473    
474                    // 基準ã?ã€intC == 0 ã®å ´å?
475                    if( prmB != null ) {
476                            if( "SD".equals( prmB ) ) {                                                     // (当月?‘æ—¥)
477                                    if( intC != 0 ) { now.add( Calendar.MONTH,intC ); }     // 5.7.4.1 (2014/03/14) CC 引数追�
478                                    now.set( Calendar.DATE,1 );
479                            }
480                            else if( "ED".equals( prmB ) ) {                                        // (当月月末)
481                                    if( intC != 0 ) { now.add( Calendar.MONTH,intC ); }     // 5.7.4.1 (2014/03/14) CC 引数追�
482                                    now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) );
483                            }
484                            else if( "BSD".equals( prmB ) ) {                                       // (先月?‘æ—¥)
485                                    // 5.7.4.1 (2014/03/14) CC 引数追�
486                                    now.add( Calendar.MONTH,intC-1 ); now.set( Calendar.DATE,1 );
487    //                              now.roll( Calendar.MONTH,false ); now.set( Calendar.DATE,1 );
488                            }
489                            else if( "BED".equals( prmB ) ) {                                       // (先月月末)
490                                    // 5.7.4.1 (2014/03/14) CC 引数追�
491                                    now.add( Calendar.MONTH,intC-1 ); now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) );
492    //                              now.roll( Calendar.MONTH,false ); now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) );
493                            }
494                            else if( "ASD".equals( prmB ) ) {                                       // (翌月?‘æ—¥)
495                                    // 5.7.4.1 (2014/03/14) CC 引数追�
496                                    now.add( Calendar.MONTH,intC+1 ); now.set( Calendar.DATE,1 );
497    //                              now.roll( Calendar.MONTH,true );  now.set( Calendar.DATE,1 );
498                            }
499                            else if( "AED".equals( prmB ) ) {                                       // (翌月月末)
500                                    // 5.7.4.1 (2014/03/14) CC 引数追�
501                                    now.add( Calendar.MONTH,intC+1 ); now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) );
502    //                              now.roll( Calendar.MONTH,true );  now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) );
503                            }
504                            else if( "SW".equals( prmB ) ) {                                        // 週åˆã‚(月曜日)ã‚»ãƒ?ƒˆ
505                                    // 5.7.4.1 (2014/03/14) CC 引数追�
506                                    if( intC != 0 ) { now.add( Calendar.DATE,intC*7 ); }    // ã¾ãšã?基準ã?日付を週å˜ä½ã§åŠ?¸›ç®—ã™ã‚‹ã?
507    
508                                    // 日付型æ–?­—å?入力データã®é–‹å§‹æ—¥ã‚’月曜日ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?
509                                    // SUNDAY=1 , MONDAY=2 ã«ãªã‚Šã¾ã™ã?月曜日ã¨ã®å·®ã?‘ã€å‰ã«æˆ»ã—ã¾ã™ã?
510                                    // æŒ?®šæ—¥ãŒæ—¥æ›œæ—¥ã®å ´åˆã?ã€æœˆæ›œæ—¥ã¾ã§æˆ»ã—ã¾ã™ã?
511    
512                                    int shu = now.get( Calendar.DAY_OF_WEEK ) - Calendar.MONDAY ;
513    
514                                    if(      shu > 0 ) { now.add( Calendar.DATE, -shu ); }
515                                    else if( shu < 0 ) { now.add( Calendar.DATE, -6 );   }
516                            }
517                            else if( "EW".equals( prmB ) ) {                                        // 週末(日曜日)ã«ã‚»ãƒ?ƒˆ
518                                    // 5.7.4.1 (2014/03/14) CC 引数追�
519                                    if( intC != 0 ) { now.add( Calendar.DATE,intC*7 ); }    // ã¾ãšã?基準ã?日付を週å˜ä½ã§åŠ?¸›ç®—ã™ã‚‹ã?
520    
521                                    // 日付型æ–?­—å?入力データã®çµ‚äº?—¥ã‚’日曜日ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?
522                                    // SUNDAY=1 , MONDAY=2 ã«ãªã‚Šã¾ã™ã?日曜日ã«ãªã‚‹ã‚ˆã?«ã€å?ã«é€²ã‚ã¾ã™ã?
523                                    int shu = now.get( Calendar.DAY_OF_WEEK ) ;
524                                    if( shu != Calendar.SUNDAY ) { now.add( Calendar.DATE, 8-shu ); }
525                            }
526                            // 5.7.4.1 (2014/03/14) H1 ??HXXX ?šæ™‚ã‚’æŒ‡å®šã?åˆ? ã‘é?ã‚る処ç?Œå®Ÿè£?•れã¦ã?ªã‹ã£ãŸã?
527    //                      else if( prmB.startsWith( "H" ) && prmB.length() > 1 ) {
528                            else if( prmB.startsWith( "H" ) ) {
529    //                              int hour = Integer.parseInt( prmB.substring( 1 ) );
530                                    int hour = intC ;
531                                    if( prmB.length() > 1 ) { hour += Integer.parseInt( prmB.substring( 1 ) ); }
532                                    now.add( Calendar.HOUR_OF_DAY , hour );
533                            }
534    //                      else if( prmB.startsWith( "D" ) && prmB.length() > 1 ) {
535                            else if( prmB.startsWith( "D" ) ) {
536    //                              int day = Integer.parseInt( prmB.substring( 1 ) );
537                                    int day = intC ;
538                                    if( prmB.length() > 1 ) { day += Integer.parseInt( prmB.substring( 1 ) ); }
539                                    now.add( Calendar.DATE, day );
540                            }
541    //                      else if( prmB.startsWith( "M" ) && prmB.length() > 1 ) {
542                            else if( prmB.startsWith( "M" ) ) {
543    //                              int month = Integer.parseInt( prmB.substring( 1 ) );
544                                    int month = intC ;
545                                    if( prmB.length() > 1 ) { month += Integer.parseInt( prmB.substring( 1 ) ); }
546                                    now.add( Calendar.MONTH , month );
547                            }
548                            else {
549                                    // 上記ã?パターン以外ã?ã€æ•°å­—(加減算ã™ã‚‹æ—¥æ•°?‰ãªã®ã§ã€å¤‰æ›ã§ããªã‘れã°ã€ãƒ•ォーマットエラー
550                                    try {
551    //                                      int day = Integer.parseInt( prmB );
552                                            int day = Integer.parseInt( prmB ) + intC ;     // 5.7.4.1 (2014/03/14) CC 引数追�
553                                            now.add( Calendar.DATE, day );
554                                    }
555                                    catch( NumberFormatException ex ) {
556                                            String errMsg = "日付変数パラメータã«ã€ä¸æ­£ãªå€¤ãŒæŒ‡å®šã•れã¾ã—ãŸã€‚以下ã?中ã‹ã‚‰æŒ?®šã—ãªãŠã—ã¦ãã ã•ã„ã€?
557                                                                    + "æŒ?®šå¯èƒ½?š[SD,ED,BSD,BED,ASD,AED,SW,EW,H1?žHXXX,D1?žDXXX,M1?žMXXX]"
558                                                                    + " prmB=[" + prmB + "]" ;
559                                            throw new RuntimeException( errMsg,ex );
560                                    }
561                            }
562                    }
563            }
564    
565            /**
566             * æŒ?®šã?å¼•æ•°ã®æ—¥ä»˜ã‘æ–?­—å?よりã€ã‚«ãƒ¬ãƒ³ãƒ?‚ªãƒ–ジェクトを作æ?ã—ã¾ã™ã?
567             * 引数ã¯ã€æ•°å­—以外ã?æ–?­—を削除ã—ãŸçŠ¶æ…‹ã«å¤‰æ›å¾Œã?処ç?«å›žã—ã¾ã™ã?
568             * ä¸è¦ãªæ–?­—を削除ã—ãŸçŠ¶æ…‹ã§ã€?¼˜æ–‡å­—以上ã«ãªã‚‹ã‚ˆã?«æŒ?®šã—ã¦ãã ã•ã„ã€?
569             * 例外的ã«ã€?¼–文字ã?å ´åˆã?ã€yyyyMM01 ã¨ã¿ãªã—ã¦ã€?01" æ–?­—å?を付与ã—ã¾ã™ã?
570             * 引数㫠null を指定ã™ã‚‹ã¨ã€ç¾åœ¨æ™‚刻ã®ã‚«ãƒ¬ãƒ³ãƒ?‚’è¿”ã—ã¾ã™ã?
571             * ãれ以外ã?ãƒ??ã‚¿ã§ã€?¼˜ã‚±ã‚¿ä»¥ä¸‹ã?å ´åˆã?ã€RuntimeException ãŒç™ºç”Ÿã—ã¾ã™ã?
572             * ?˜ã‚±ã‚¿ä»¥ä¸Šï¼‘4ケタ未æº??å ´åˆã?ã€?¼˜ã‚±ã‚¿åˆ?‚’ã€å¹´æœˆæ—¥ã«åˆ?›¢ã—ãŸã‚«ãƒ¬ãƒ³ãƒ?
573             * オブジェクトを作æ?ã—ã¾ã™ã??‘4ケタ以上ã§åˆã‚ã¦ã€æ™‚åˆ?§’ã‚’å«ã‚?‚«ãƒ¬ãƒ³ãƒ?
574             * を作æ?ã—ã¾ã™ã?
575             *
576             * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæ?
577             * @og.rev 5.5.8.2 (2012/11/09) value ã®åˆ¤å®šã«ã€null 㨠ゼロæ–?­—å?を判定ã™ã‚‹ã?
578             *
579             * @param value æ—¥ä»˜ã‘æ–?­—å?
580             *
581             * @return      カレンãƒ?‚ªãƒ–ジェクãƒ?引数ãŒnullã®å ´åˆã?ã€ç¾åœ¨æ™‚刻)
582             */
583            public static final Calendar getCalendar( final String value ) {
584                    Calendar cal = Calendar.getInstance();
585    
586    //              if( value == null ) { return cal; }
587                    if( value == null || value.isEmpty() ) { return cal; }          // 5.5.8.2 (2012/11/09) null 㨠ゼロæ–?­—å?を判定ã™ã‚‹ã?
588    
589                    // 日付表記ã«ä¸è¦ãªæ–?­—を削除ã—ã¾ã™ã?
590                    String dateStr = parseNumber( value ) ;
591    
592                    if( dateStr.length() == 6 ) { dateStr = dateStr + "01"; }       // yyyyMM01 å½¢å¼ã«ç„¡ç?‚„りåˆã‚ã›ã‚‹ã?
593                    else if( dateStr.length() < 8 ) {
594                            String errMsg = "日付指定パラメータã«ã€ä¸æ­£ãªå€¤ãŒæŒ‡å®šã•れã¾ã—ãŸã€‚value=[" + value + "]" ;
595                            throw new RuntimeException( errMsg );
596                    }
597    
598                    cal.clear();    // 日付文字å?ãŒå­˜åœ¨ã™ã‚‹ã®ã§ã€ã‚«ãƒ¬ãƒ³ãƒ?‚’リセãƒ?ƒˆ
599    
600                    int year   = Integer.parseInt( dateStr.substring( 0,4 ) );
601                    int month  = Integer.parseInt( dateStr.substring( 4,6 ) ) - 1;
602                    int date   = Integer.parseInt( dateStr.substring( 6,8 ) );
603    
604                    int hour=0, minute=0, second=0;
605                    if( dateStr.length() >= 14 ) {
606                            hour   = Integer.parseInt( dateStr.substring( 8,10 ) );
607                            minute = Integer.parseInt( dateStr.substring( 10,12 ) );
608                            second = Integer.parseInt( dateStr.substring( 12,14 ) );
609                    }
610    
611                    cal.set( year,month,date,hour,minute,second );
612    
613                    return cal;
614            }
615    
616            /**
617             * æŒ?®šã?å¼•æ•°ã®æ—¥ä»˜ã‘æ–?­—å?(yyyyMMdd)ã‚ˆã‚Šã€æ—¥ä»˜ã‚’åŠ?®—ã—ã¦è¿”ã—ã¾ã™ã?
618             * マイナスを与ãˆã‚‹ã¨ã€æ¸›ç®—ã—ã¾ã™ã?
619             * 日付以上ã?ç²¾åº¦ã®æ–?­—å?を渡ã—ã¦ã‚‚ã?日付ã?ã¿ã®è¨ˆç®—ã¨ãªã‚Šã¾ã™ã?
620             * çµæžœã¯ã€å¼•æ•°ã®æ—¥ä»˜ãƒ•ォーマットã¨ã¯å…¨ã別ã§ã€yyyyMMdd ã®?˜æ–‡å­—å½¢å¼ã«ãªã‚Šã¾ã™ã?
621             * 引数㫠null を渡ã™ã¨ã€å®Ÿè¡Œæ™‚ã®æ—¥ä»˜ã‚’ベã?スã¨ã—ã¦å‡¦ç?—ã¾ã™ã?
622             *
623             * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæ?
624             *
625             * @param baseDate æ—¥ä»˜ã‘æ–?­—å?(yyyyMMdd)
626             * @param plus     åŠ?®—ã™ã‚‹æ—¥æ•°(éŽåŽ»ã«ã™ã‚‹ã«ã¯ãƒžã‚¤ãƒŠã‚¹å€¤ã‚’指定ã™ã‚?
627             *
628             * @return      çµæžœã®æ—¥ä»?yyyyMMdd)
629             */
630            public static final String getDatePlus( final String baseDate,final int plus ) {
631                    Calendar cal = getCalendar( baseDate );
632                    cal.add( Calendar.DATE,plus );
633    
634                    return getDate( cal.getTimeInMillis() , "yyyyMMdd" );
635            }
636    
637            /**
638             * ç¾åœ¨ã®æœˆã«ã€æŒ‡å®šã?月数をã?ラスã—ãŸæ—¥ä»˜æ–‡å­—å?ã‚’è¿”ã—ã¾ã™ã?
639             * 日付文字å?ã®ãƒ•ォーマットã?ã€?yyyyMM" ã§ã™ã?
640             * æŒ?®šã™ã‚‹æœˆæ•°ã«ãƒžã‚¤ãƒŠã‚¹ã‚’指定ã™ã‚‹ã¨ã€æ¸›ç®—ã§ãã¾ã™ã?
641             *
642             * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæ?
643             *
644             * @param baseDate æ—¥ä»˜ã‘æ–?­—å?(yyyyMM)
645             * @param plus     åŠ?®—ã™ã‚‹æœˆæ•°(éŽåŽ»ã«ã™ã‚‹ã«ã¯ãƒžã‚¤ãƒŠã‚¹å€¤ã‚’指定ã™ã‚?
646             *
647             * @return      æŒ?®šã?月数をã?ラスã—ãŸæ—¥ä»˜æ–‡å­—å?(yyyyMM)
648             */
649            public static final String getMonthPlus( final String baseDate,final int plus ) {
650                    Calendar cal = getCalendar( baseDate );
651                    cal.set( Calendar.DATE, 1 );            // 当月㮠1 æ—¥ã«è¨­å®?
652                    cal.add( Calendar.MONTH , plus );
653    
654                    return getDate( cal.getTimeInMillis() , "yyyyMM" );
655            }
656    
657            /**
658             * æŒ?®šã?å¼•æ•°ã®æ—¥ä»˜ã‘æ–?­—å?(yyyyMMddã€yyyyMMddHHmmss)ã«ã€æ—¥ä»˜ã‚’åŠ?®—ã—ã¦è¿”ã—ã¾ã™ã?
659             * マイナスを与ãˆã‚‹ã¨ã€æ¸›ç®—ã—ã¾ã™ã?
660             *
661             * æŒ?®šã™ã‚‹æ—¥ä»˜ã«ã¯ã€å˜ä½ã‚’付与ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã?
662             * å˜ä½ã?ã€yyyyMMddHHmmss å½¢å¼ã??‘文字をæŒ?®šã—ã¾ã™ã?大æ–?­—ã?å°æ–‡å­—も識別ã—ã¾ã™ã?
663             * plus="5M" ã¨ã™ã‚Œã°ã€?¼•ã‹æœˆã?plus="5d"  ã¨ã™ã‚Œã°ã€?¼•æ—¥ 追åŠ?—ã¾ã™ã?
664             * plus ã«å˜ä½ã‚’付ã‘ãªã??åˆã?ã€tani ã«æŒ?®šã?å˜ä½ã‚’使ã?¾ã™ã?
665             * plus ãã?ã‚‚ã?ãŒã?null ã‹ã?isEmpty ã®å ´åˆã?ã€åŠ ç®—ã?ã€? ã«ãªã‚Šã¾ã™ã?
666             *
667             * baseDate æ–?­—å?を日付文字å?ã«å¤‰æ›å¾Œã?Calendar ã§è¨ˆç®—ã—ã€çµæžœã‚’ã?format å½¢å¼ã«å¤‰æ›ã—ã¾ã™ã?
668             * 引数㫠null を渡ã™ã¨ã€å®Ÿè¡Œæ™‚ã®æ—¥ä»˜ã‚’ベã?スã¨ã—ã¦å‡¦ç?—ã¾ã™ã?
669             *
670             * @og.rev 5.6.1.0 (2013/02/01) æ–°è¦ä½œæ?
671             *
672             * @param baseDate æ—¥ä»˜ã‘æ–?­—å?(yyyyMMddã€yyyyMMddHHmmss å½¢å¼ã?日付文字å?)
673             * @param plus     åŠ?®—ã™ã‚‹æ—¥æ•°(日付å˜ä½ã‚’å«ã‚??å˜ä½ã?ã€y,M,d,H,m,s ã®æ–?­—ã§ã€å¤§æ–?­—å°æ–‡å­—ã?区別ãŒã‚りã¾ã?
674             * @param defTani  日付å˜ä½ãŒæœªæŒ?®šã?å ´åˆã?åˆæœŸå˜ä½?'y','M','d','H','m','s' ã®ã©ã‚Œã‹)
675             * @param format   è¿”ã™æ—¥ä»˜æ–‡å­—å?ã®ãƒ•ォーマッãƒ?yyyyMMddã€yyyyMMddHHmmss)
676             *
677             * @return      çµæžœã®æ—¥ä»?yyyyMMdd)
678             * @throws      NumberFormatException åŠ?®—ã™ã‚‹æ—¥æ•°ã®å˜ä½ãŒ('y','M','d','H','m','s')以外ã?å ´åˆã?
679             */
680            public static final String getDatePlus( final String baseDate,final String plus,final int defTani,final String format ) {
681    
682                    int addSu = 1;                          // åˆæœŸå€¤(plus ã?null ã‚?Empty ã®å ´åˆã?ã€?¼‹ï¼‘ã¨ãªã‚?
683                    int tani  = defTani;
684    
685                    if( plus != null && !plus.isEmpty() ) {
686                            boolean flag = true;    // 日付å˜ä½ã‚’æŒã£ã¦ã?‚‹ã‹ã©ã?‹ã€‚æŒã£ã¦ã?‚‹å ´åˆã?ã€true
687                            char ch = plus.charAt( plus.length()-1 );               // æœ?¾Œã?ä¸?–‡å­—ã‚’å–å¾?å˜ä½ã‹ã€æ•°å­—本ä½?
688                            switch( ch ) {
689                                    case 'y' : tani = Calendar.YEAR;                break ;
690                                    case 'M' : tani = Calendar.MONTH;               break ;
691                                    case 'd' : tani = Calendar.DATE;                break ;
692                                    case 'H' : tani = Calendar.HOUR_OF_DAY; break ;
693                                    case 'm' : tani = Calendar.MINUTE;              break ;
694                                    case 's' : tani = Calendar.SECOND;              break ;
695                                    default  : flag = false;        break ;         // 日付å˜ä½ã‚’æŒã£ã¦ã?ªã??
696                            }
697                            if( flag ) {
698                                    addSu = Integer.parseInt( plus.substring( 0,plus.length()-1 ) );        // 日付å˜ä½?ã‚り
699                            }
700                            else {
701                                    addSu = Integer.parseInt( plus ) ;                                                                      // 日付å˜ä½?ãªã?
702                            }
703                    }
704    
705                    Calendar cal = getCalendar( baseDate );
706                    cal.add( tani,addSu );
707    
708                    return getDate( cal.getTimeInMillis() , format );
709            }
710    }