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 */ 016package org.opengion.fukurou.util; 017 018import java.util.Calendar; 019import java.util.Locale; 020import java.util.Map; 021import java.util.HashMap; 022import java.text.DateFormat; 023import java.text.SimpleDateFormat; 024import java.text.ParseException; 025import java.util.List; // 7.0.5.0 (2019/09/09) 026import java.util.ArrayList; // 7.0.5.0 (2019/09/09) 027 028import org.opengion.fukurou.system.DateSet; // 6.4.2.0 (2016/01/29) 029import org.opengion.fukurou.system.OgRuntimeException ; // 6.4.2.0 (2016/01/29) 030 031import static org.opengion.fukurou.system.HybsConst.BUFFER_SMALL; // 6.1.0.0 (2014/12/26) refactoring 032 033/** 034 * HybsDateUtil.java ã¯ï½¤å…±é€šçš„ã«ä½¿ç”¨ã•ã‚Œã‚‹ Date,Calender関連メソッドを集約ã—ãŸï½¤staticメソッドã®ã¿ã§æ§‹æˆã•ã‚Œã‚‹ï½¸ï¾—ï½½ã§ã™ï½¡ 035 * 036 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæˆ 037 * 038 * @og.group ユーティリティ 039 * 040 * @version 5.5 041 * @author Kazuhiko Hasegawa 042 * @since JDK7.0, 043 */ 044public final class HybsDateUtil { 045 046 /** å„種フォーï¾ï½¯ï¾„を簡易的ã«è¡¨ã—ãŸæ–‡å—列 */ 047 /** staticイニシャライザ後、èªã¿å–り専用ã«ã™ã‚‹ã®ã§ï½¤ConcurrentHashMap を使用ã—ã¾ã›ã‚“。 */ 048 private static final Map<String,String> DATE_FORMAT = new HashMap<>(); 049 static { 050 DATE_FORMAT.put( "Y4" ,"yyyy" ); // 6.9.2.1 (2018/03/12) 051 DATE_FORMAT.put( "YMD" ,"yyyyMMdd" ); 052 DATE_FORMAT.put( "Y2MD" ,"yyMMdd" ); 053 DATE_FORMAT.put( "YM" ,"yyyyMM" ); 054 DATE_FORMAT.put( "MD" ,"MMdd" ); // 5.5.5.2 (2012/08/18) 055 DATE_FORMAT.put( "HMS" ,"HHmmss" ); 056 DATE_FORMAT.put( "HM" ,"HHmm" ); // 6.7.4.1 (2017/02/17) 057 DATE_FORMAT.put( "YMDHMS" ,"yyyyMMddHHmmss" ); 058 DATE_FORMAT.put( "YMDHM" ,"yyyyMMddHHmm" ); // 7.0.5.0 (2019/09/16) 059 DATE_FORMAT.put( "YMDH" ,"yyyyMMddHH" ); // 7.0.5.0 (2019/09/16) 060 DATE_FORMAT.put( "EEE" ,"EEE" ); 061 DATE_FORMAT.put( "YMDF" ,"yyyy/MM/dd" ); 062 DATE_FORMAT.put( "YMD-F" ,"yyyy-MM-dd" ); // 8.0.1.2 (2021/11/19) HTML5 type="date" 063 DATE_FORMAT.put( "Y2MDF" ,"yy/MM/dd" ); 064 DATE_FORMAT.put( "YMF" ,"yyyy/MM" ); 065 DATE_FORMAT.put( "YM-F" ,"yyyy-MM" ); // 8.0.1.2 (2021/11/19) HTML5 type="month" 066 DATE_FORMAT.put( "HMSF" ,"HH:mm:ss" ); 067 DATE_FORMAT.put( "HMF" ,"HH:mm" ); // 6.7.4.1 (2017/02/17) 068 DATE_FORMAT.put( "YMDHMSF" ,"yyyy/MM/dd HH:mm:ss" ); 069 DATE_FORMAT.put( "YMDHMF" ,"yyyy/MM/dd HH:mm" ); // 7.0.5.0 (2019/09/16) 070 DATE_FORMAT.put( "YMDHM-F" ,"yyyy-MM-dd'T'HH:mm" ); // 8.0.1.2 (2021/11/19) HTML5 type="datetime-local" 071 DATE_FORMAT.put( "MDF" ,"MM/dd" ); // 5.5.0.2 (2012/03/09) 072 DATE_FORMAT.put( "MDEF" ,"MM/dd(EEE)" ); // 5.5.0.2 (2012/03/09) 曜日 073 DATE_FORMAT.put( "MDHMF" ,"MM/dd HH:mm" ); // 7.0.0.1 (2018/10/09) 074 DATE_FORMAT.put( "MD2F" ,"MM月ddæ—¥" ); // 5.5.5.2 (2012/08/18) æ¼¢å— 075 DATE_FORMAT.put( "HM2F" ,"HH時mm分" ); // 7.0.0.1 (2018/10/09) æ¼¢å— 076 DATE_FORMAT.put( "MDHM2F" ,"MM月ddæ—¥ HH時mm分" ); // 7.0.0.1 (2018/10/09) æ¼¢å— 077 DATE_FORMAT.put( "GYMDF" ,"GGGGyyyyå¹´MM月ddæ—¥" ); // 5.5.0.2 (2012/03/09) 和暦 078 DATE_FORMAT.put( "G2YMDF" ,"Gyyyy/MM/dd" ); // 5.5.0.2 (2012/03/09) 和暦 079 DATE_FORMAT.put( "GYMF" ,"GGGGyyyyå¹´MM月" ); // 5.5.0.2 (2012/03/09) 和暦 080 DATE_FORMAT.put( "GYF" ,"GGGGyyyy" ); // 5.5.0.2 (2012/03/09) 和暦 081 } 082 083 private static final int DD = 1000 * 60 * 60 * 24 ; // ï¾ï¾˜ç§’ → æ—¥ 084 private static final int HH = 1000 * 60 * 60 ; // ï¾ï¾˜ç§’ → 時 085 private static final int MM = 1000 * 60 ; // ï¾ï¾˜ç§’ → 分 086 private static final int SS = 1000 ; // ï¾ï¾˜ç§’ → 秒 087 088 // ※ Locale.of ã¯ã€JDK19 ã§æŽ¡ç”¨ãªã®ã§ã€JDK17ã¨ã®äº’æ›æ€§ãŒãªã„。 089// private static final Locale JA_JP_JP = Locale.of( "ja", "JP", "JP" ); // 8.5.3.2 (2023/10/13) JDK21対応 090 @SuppressWarnings( "deprecation" ) // 8.5.3.2 (2023/10/13) JDK21対応 091 private static final Locale JA_JP_JP = new Locale("ja","JP","JP"); // 旧方å¼ã§ã€è¦å‘ŠãŒå‡ºã‚‹ã€‚ 092 093 /** 094 * デフォルトコï¾ï½½ï¾„ラクターをprivateã«ã—ã¦ã€ 095 * オブジェクトã®ç”Ÿæˆã‚’ã•ã›ãªã„よã†ã«ã™ã‚‹ã€‚ 096 * 097 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæˆ 098 */ 099 private HybsDateUtil() {} 100 101 /** 102 * 指定ã®æ–‡å—列ã‹ã‚‰ï½¤ä»¥ä¸‹ã®æ–‡å—を削除ã—ãŸæ–‡å—列を返ã—ã¾ã™ï½¡ 103 * '/' , '-' , ' ' , ':' ã®æ•°å—以外ã®æ–‡å—ã‚’å«ã‚€ï¾Œï½«ï½°ï¾ï½¯ï¾„ã•ã‚ŒãŸ 104 * 日付文å—列を、日付データã ã‘ã«å¤‰æ›ã™ã‚‹å ´åˆã«åˆ©ç”¨ã™ã‚‹ã“ã¨ã‚’想定ã—ã¦ã„ã¾ã™ï½¡ 105 * よã£ã¦ï½¤ï¾ï½²ï¾…ス記å·ã‚„、å°æ•°ç‚¹ï½¤ï½ºï¾ï¾ãªã©ã‚‚削除ã•ã‚Œã¾ã™ï½¡ 106 * ã“ã®ï¾’ソッドã§ã¯ï½¤æ—¥ä»˜ã¨ã—ã¦ã®æ•´åˆæ€§ã‚„æ¡ï¾ï½ªï½¯ï½¸ã¯è¡Œã„ã¾ã›ã‚“ãŒï½¤ 107 * æ¡æ•°ã¯ï½¤6æ¡ï½¤8æ¡ï½¤14æ¡ã®ã©ã‚Œã‹ã«ï½¤åˆã‚ã›ã¾ã™ï½¡ 108 * ï½¢yyyy/MM/dd HH:mm:ssï½£ å½¢å¼ã‚’基準ã¨ã—ã¾ã™ãŒï½¤ï½¢yyyy/M」「yyyy/M/d」「yy/M/d」「M/dï½£ 109 * ï½¢HH:mm:ss」「H:m」形å¼ã«ã‚‚、対応ã—ã¾ã™ï½¡ 110 * "/" ãŒï½¤"-" ã«å¤‰æ›´ã•ã‚Œã¦ã„るケースも対応å¯èƒ½ã§ã™ãŒï½¤æœˆ/å¹´ å½¢å¼ã‚„、英語、日本語㮠111 * 月表示ã«ã¯æœªå¯¾å¿œã§ã™ï½¡ 112 * 113 * 引数ãŒï½¤null ã®å ´åˆã¯ï½¤ï½¾ï¾žï¾›æ–‡å—列ã«ï½¤å¤‰æ›ã—ã¾ã™ï½¡ 114 * 115 * ※ 6.0.2.5 (2014/10/31) æ¡æ•°ï¾ï½ªï½¯ï½¸ã ã‘ã¯è¡Œã„ã¾ã™ï½¡ 116 * æ¡æ•°ã¯ï½¤6æ¡ï½¤8æ¡ï½¤14æ¡ã®ã©ã‚Œã‹ã«ï½¤åˆã‚ã›ã¾ã™ï½¡ 117 * 118 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæˆ 119 * @og.rev 5.5.8.3 (2012/11/17) æ•°å—ã®ã¿è¿”ã™ä»•æ§˜ã ã£ãŸãŒï½¤å¯¾è±¡ä»¥å¤–ã®æ–‡å—入力ã¯ãã®ã¾ã¾è¿”ã™ã‚ˆã†å¤‰æ›´ 120 * @og.rev 6.0.2.5 (2014/10/31) 簡易的ãªæ¡æ•°ï¾ï½ªï½¯ï½¸ã ã‘ã¯è¡Œã„ã¾ã™ï½¡ 121 * @og.rev 6.2.3.0 (2015/05/01) 内部処ç†ã‚’大幅ã«å¤‰æ›´ã—ã¾ã™ï½¡ 122 * @og.rev 8.0.1.2 (2021/11/19) yyyy-MM-ddTHH:mm 対応(ï½½ï¾ï¾Ÿï½°ï½½ã§ã¯ãªãTã§åŒºåˆ‡ã‚‹) 123 * @og.rev 8.5.5.1 (2024/02/29) switchæ–‡ã«ã‚¢ãƒãƒ¼æ§‹æ–‡ã‚’使用 124 * 125 * @param value ä»»æ„ã®æ–‡å—列(例:2001/04/17 15:48:22) 126 * 127 * @return æ•°å—ã ã‘ã§æ§‹æˆã•ã‚Œã‚‹æ–‡å—列(例:20010417154822)(nullã¯ï½¾ï¾žï¾›æ–‡å—列を返ã—ã¾ã™) 128 * @og.rtnNotNull 129 */ 130 public static String parseNumber( final String value ) { 131 if( value == null || value.isEmpty() ) { return ""; } 132 133 // å¹´ や、年月日 ãŒçœç•¥ã•ã‚ŒãŸå ´åˆã¯ï½¤å®Ÿè¡Œæ—¥ã‚’セットã™ã‚‹ï½¡ 134 final String today = DateSet.getDate( "yyyyMMdd" ); 135 136 String val = value.trim(); 137 val = val.replaceAll( "-" , "/" ); // yyyy-MM-dd å½¢å¼ã‚’、yyyy/MM/dd å½¢å¼ã«ã™ã‚‹ï½¡ 138 139 // 8.0.1.2 (2021/11/19) yyyy-MM-ddTHH:mm 対応(ï½½ï¾ï¾Ÿï½°ï½½ã§ã¯ãªãTã§åŒºåˆ‡ã‚‹) 140 val = val.replaceAll( "T" , " " ); 141 142 final int ad = val.indexOf( ' ' ) ; 143 String ymd = val ; 144 String hms = null ; 145 146 if( ad > 0 ) { // ï½½ï¾ï¾Ÿï½°ï½½ãŒã‚ã‚Œã°ï½¤å¹´æœˆæ—¥ 㨠時分秒 ã«åˆ¥ã‚Œã‚‹ï½¡ 147 ymd = val.substring( 0,ad ); 148 hms = val.substring( ad+1 ); 149 } 150 else if( val.indexOf( ':' ) > 0 ) { 151 ymd = today; // 年月日 ã¯ä»Šæ—¥ã«ãªã‚‹ï½¡ 152 hms = val; 153 } 154 155 final StringBuilder buf = new StringBuilder( BUFFER_SMALL ); 156 157 if( ymd != null ) { 158 final String[] ymdSp = ymd.split( "/" ); 159 // 8.5.5.1 (2024/02/29) switchæ–‡ã«ã‚¢ãƒãƒ¼æ§‹æ–‡ã‚’使用 160// switch( ymdSp.length ) { 161// case 1 : buf.append( ymdSp[0] ); break; // "/" ãŒå˜åœ¨ã—ãªã„。 162// case 2 : if( ymdSp[0].length() < 4 ) { // MM/dd ã®ï½¹ï½°ï½½ï½¡yy/MM ã¯æƒ³å®šå¤– 163// buf.append( today.substring( 0,4 ) ); // yyyy ã®å¹´ã‚’è¨å®š 164// } 165// buf.append( addZero( ymdSp[0] ) ).append( addZero( ymdSp[1] ) ); break; 166// default: if( ymdSp[0].length() == 2 ) { // yy/MM/dd ã®ï½¹ï½°ï½½ã‚’想定 167// buf.append( today.substring( 0,2 ) ); // yy ã®å¹´ã®å…ˆé ï¼’æ¡ã‚’è¨å®š 168// } 169// buf.append( ymdSp[0] ) 170// .append( addZero( ymdSp[1] ) ) 171// .append( addZero( ymdSp[2] ) ); break; 172 switch( ymdSp.length ) { 173 case 1 -> buf.append( ymdSp[0] ); // "/" ãŒå˜åœ¨ã—ãªã„。 174 case 2 -> { 175 if( ymdSp[0].length() < 4 ) { // MM/dd ã®ï½¹ï½°ï½½ï½¡yy/MM ã¯æƒ³å®šå¤– 176 buf.append( today.substring( 0,4 ) ); // yyyy ã®å¹´ã‚’è¨å®š 177 } 178 buf.append( addZero( ymdSp[0] ) ).append( addZero( ymdSp[1] ) ); 179 } 180 default -> { 181 if( ymdSp[0].length() == 2 ) { // yy/MM/dd ã®ï½¹ï½°ï½½ã‚’想定 182 buf.append( today.substring( 0,2 ) ); // yy ã®å¹´ã®å…ˆé ï¼’æ¡ã‚’è¨å®š 183 } 184 buf.append( ymdSp[0] ) 185 .append( addZero( ymdSp[1] ) ) 186 .append( addZero( ymdSp[2] ) ); 187 } 188 } 189 } 190 if( hms != null ) { 191 final String[] hmsSp = hms.split( ":" ); // HH:mm:ss 192 // 8.5.5.1 (2024/02/29) switchæ–‡ã«ã‚¢ãƒãƒ¼æ§‹æ–‡ã‚’使用 193// switch( hmsSp.length ) { 194// case 1 : buf.append( hmsSp[0] ); break; // ":" ãŒå˜åœ¨ã—ãªã„。 195// case 2 : buf.append( addZero( hmsSp[0] ) ) // HH:mm ã®ï½¹ï½°ï½½ï½¡mm:ss ã¯æƒ³å®šå¤– 196// .append( addZero( hmsSp[1] ) ) 197// .append( "00" ); break; 198// default: buf.append( addZero( hmsSp[0] ) ) // HH:mm:ss ã®ï½¹ï½°ï½½ã‚’想定 199// .append( addZero( hmsSp[1] ) ) 200// .append( addZero( hmsSp[2] ) ); break; 201// } 202 switch( hmsSp.length ) { 203 case 1 -> buf.append( hmsSp[0] ); // ":" ãŒå˜åœ¨ã—ãªã„。 204 case 2 -> { 205 buf.append( addZero( hmsSp[0] ) ) // HH:mm ã®ï½¹ï½°ï½½ï½¡mm:ss ã¯æƒ³å®šå¤– 206 .append( addZero( hmsSp[1] ) ) 207 .append( "00" ); 208 } 209 default -> { 210 buf.append( addZero( hmsSp[0] ) ) // HH:mm:ss ã®ï½¹ï½°ï½½ã‚’想定 211 .append( addZero( hmsSp[1] ) ) 212 .append( addZero( hmsSp[2] ) ); 213 } 214 } 215 } 216 217 return buf.toString(); 218 } 219 220 /** 221 * 指定ã®æ–‡å—列ãŒï½¤ä¸€æ¡ã®å ´åˆï½¤å…ˆé ã« 0 ã‚’è¿½åŠ ã—ã¾ã™ï½¡ 222 * 223 * ã“ã‚Œã¯ï½¤3/4 ã®æ§˜ãªæ—¥ä»˜ã‚’、0304 ã«ã™ã‚‹å ´åˆã®ï½»ï¾Žï¾Ÿï½°ï¾„メソッドã§ã™ï½¡ 224 * 225 * @og.rev 6.2.3.0 (2015/05/01) æ–°è¦è¿½åŠ 226 * 227 * @param val ä»»æ„ã®æ–‡å—列 228 * 229 * @return 一æ¡ã®å ´åˆï½¤å…ˆé ã« 0 ã‚’è¿½åŠ 230 */ 231 private static String addZero( final String val ) { 232 return val.length() == 1 ? ("0" + val) : val ; 233 } 234 235 /** 236 * 指定ã®æ–‡å—列ã‹ã‚‰ï½¤yyyy-mm-dd hh:mm:ss å½¢å¼ã®æ–‡å—列を作æˆã—ã¾ã™ï½¡ 237 * 238 * ã“ã‚Œã¯ï½¤java.sql.Timestamp オブジェクトを文å—列ã‹ã‚‰ä½œæˆã™ã‚‹ã«å½“ãŸã‚Šï½¤ 239 * Timestamp ã®æ–‡å—列形å¼ã«ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„ãŸã‚ã§ã™ï½¡ 240 * æ¡æ•°ã¯ï½¤ï¼˜æ¡ ã¾ãŸã¯ï½¤ï¼‘ï¼”æ¡ä»¥å¤–ã®å ´åˆã¯ï½¤å¤‰æ›ï½´ï¾—ï½°ã¨ã—ã¾ã™ï½¡ 241 * 242 * @og.rev 5.5.8.5 (2012/11/27) æ–°è¦ä½œæˆ 243 * 244 * @param value ä»»æ„ã®æ–‡å—列(例:20010417 or 20010417154822) 245 * 246 * @return Timestampã®æ–‡å—列形å¼ï¼ˆä¾‹ï¼š2001-04-17 00:00:00 or 2001-04-17 15:48:22) 247 */ 248 public static String parseTimestamp( final String value ) { 249 if( value == null || value.length() != 8 && value.length() != 14 ) { // 6.9.7.0 (2018/05/14) PMD 250 final String errMsg = "日付文å—列ã¯ï½¤ï¼˜æ¡ ã¾ãŸã¯ï½¤ï¼‘ï¼”æ¡ã§æŒ‡å®šã—ã¦ãã ã•ã„。" 251 + " value=[" + value + "]" ; 252 throw new OgRuntimeException( errMsg ); 253 } 254 255 // 6.0.2.5 (2014/10/31) char ã‚’ append ã™ã‚‹ï½¡ 256 final StringBuilder buf = new StringBuilder( BUFFER_SMALL ) 257 .append( value.substring( 0,4 ) ).append( '-' ) 258 .append( value.substring( 4,6 ) ).append( '-' ) 259 .append( value.substring( 6,8 ) ).append( ' ' ); 260 if( value.length() == 8 ) { 261 buf.append( "00:00:00" ); 262 } 263 else { 264 buf.append( value.substring( 8,10 ) ).append( ':' ) 265 .append( value.substring( 10,12 ) ).append( ':' ) 266 .append( value.substring( 12,14 ) ); 267 } 268 269 return buf.toString(); 270 } 271 272 /** 273 * 日付文å—列ã®æ¡æ•°ã®æ•´åˆæ€§ã‚’å–ã‚Šã¾ã™ï½¡ 274 * ã“ã‚Œã¯ï½¤å†…部ã§ï½¤parseNumber(String) 処ç†ã«ã‚ˆã‚Šï½¤ä¸è¦ãªï¾Œï½«ï½°ï¾ï½¯ï¾„記å·ã‚’削除ã—ã¾ã™ï½¡ 275 * ã“ã“ã§ã¯ï½¤åŸºæœ¬çš„ã«ã¯ï½¤ï¼–æ–‡å—(yyyyMM)、8文å—(yyyyMMdd)、14文å—(yyyyMMddHHmmss) 276 * ã®æ—¥ä»˜æ–‡å—列を作æˆã™ã‚‹ã“ã¨ã‚’想定ã—ã¦ã„ã¾ã™ãŒï½¤æŒ‡å®šã®æ¡æ•°ä»¥å¤–ã¯ï½¤ï½´ï¾—ï½°ã«ãªã‚Šã¾ã™ï½¡ 277 * 278 * 引数ãŒï½¤null ⇒ æ¡æ•°ã«ç„¡é–¢ä¿‚ã«ï½¤ç©ºæ–‡å—列を返ã™ï½¡ 279 * 引数ã®æ¡æ•°ãŒä¸€è‡´ ⇒ ãã®å€¤ã‚’è¿”ã™ï½¡ 280 * 引数ã®æ¡æ•°ãŒä¸ä¸€è‡´ ⇒ ï½´ï¾—ï½° 281 * ãŸã ã—、引数ã®æœ€å¤§é•·ã¯ï½¤ï¼‘4ケタã«åˆ¶é™ã—ã¦ã„ã¾ã™ï½¡ 282 * 283 * ã“ã®ï¾’ソッドã§ã¯ï½¤æ—¥ä»˜ã¨ã—ã¦æˆç«‹ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ï¼ˆ99999999ãªã©ï¼‰ã¯åˆ¤å®šã—ã¦ã„ã¾ã›ã‚“。 284 * 285 * @og.rev 5.6.6.0 (2013/07/05) メソッドã®å†…容を移ã™ï½¡ 286 * 287 * @param value ä»»æ„ã®æ—¥ä»˜ã‘æ–‡å—列 288 * @param size 変æ›ã—ãŸã„æ¡æ•° 289 * 290 * @return æ•°å—ã ã‘ã§æ§‹æˆã•ã‚Œã‚‹æ–‡å—列(例:20010417154822)(nullã¯ï½¾ï¾žï¾›æ–‡å—列を返ã—ã¾ã™) 291 * @og.rtnNotNull 292 */ 293 public static String parseDate( final String value , final int size ) { 294 return parseDate( value , size , size ); // 最å°ã¨æœ€å¤§ã‚’åŒã˜å€¤ã«ã™ã‚‹ï½¡ 295 } 296 297 /** 298 * 日付文å—列ã®æ¡æ•°ã®æ•´åˆæ€§ã‚’å–ã‚Šã¾ã™ï½¡ 299 * ã“ã‚Œã¯ï½¤å†…部ã§ï½¤parseNumber(String) 処ç†ã«ã‚ˆã‚Šï½¤ä¸è¦ãªï¾Œï½«ï½°ï¾ï½¯ï¾„記å·ã‚’削除ã—ã¾ã™ï½¡ 300 * ã“ã“ã§ã¯ï½¤åŸºæœ¬çš„ã«ã¯ï½¤ï¼–æ–‡å—(yyyyMM)、8文å—(yyyyMMdd)、14文å—(yyyyMMddHHmmss) 301 * ã®æ—¥ä»˜æ–‡å—列を作æˆã™ã‚‹ã“ã¨ã‚’想定ã—ã¦ã„ã¾ã™ãŒï½¤ãれ以外ã®æ¡æ•°ã§ã‚‚下記ã®ï¾™ï½°ï¾™ã«å¾“ã£ã¦ 302 * 処ç†ã•ã‚Œã¾ã™ï½¡ 303 * 304 * 引数ãŒï½¤null ⇒ æ¡æ•°ã«ç„¡é–¢ä¿‚ã«ï½¤ç©ºæ–‡å—列を返ã™ï½¡ 305 * 引数ã®æ¡æ•°ãŒç¯„囲内 ⇒ 以下ã®å‡¦ç†ã‚’実行ã™ã‚‹ï½¡ 306 * 引数ã®æ¡æ•°ã‚’åŒã˜ ⇒ ãã®ã¾ã¾è¿”ã™ï½¡ 307 * 引数ã®æ¡æ•°ã‚ˆã‚Šå¤§ãㄠ⇒ 余をカットã—ã¦ï½¤å¼•æ•°ã®æœ€å¤§é•·ã«ãã‚ãˆã‚‹ï½¡ 308 * 引数ã®æ¡æ•°ã«è¶³ã‚Šãªã„ ⇒ "20000101000000" ã®æ–‡å—列ã®éƒ¨åˆ†æ–‡å—列をçµåˆã•ã›ã¦ï½¤å¼•æ•°ã®æœ€å¤§é•·ã«ãã‚ãˆã‚‹ï½¡ 309 * ãŸã ã—、引数ã®æœ€å¤§é•·ã¯ï½¤ï¼‘4ケタã«åˆ¶é™ã—ã¦ã„ã¾ã™ï½¡ 310 * 311 * ã“ã®ï¾’ソッドã§ã¯ï½¤æ—¥ä»˜ã¨ã—ã¦æˆç«‹ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ï¼ˆ99999999ãªã©ï¼‰ã¯åˆ¤å®šã—ã¦ã„ã¾ã›ã‚“。 312 * 313 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæˆ 314 * @og.rev 5.6.1.1 (2013/02/08) æ¡æ•°ï¾ï½ªï½¯ï½¸å°Žå…¥ï½¡ï¼–æ¡ä»¥ä¸‹ã ã¨ï½´ï¾—ï½°ã«ã™ã‚‹ï½¡ 315 * @og.rev 5.6.6.0 (2013/07/05) æ¡æ•°ï¾ï½ªï½¯ï½¸ã®æœ€å°-最大指定 316 * @og.rev 6.2.3.0 (2015/05/01) len == maxSize ã®ã¨ã、パース文å—列ã§ã¯ãªã、元ã®å€¤ã‚’è¿”ã—ã¦ã„ãŸï½¡ 317 * 318 * @param value ä»»æ„ã®æ—¥ä»˜ã‘æ–‡å—列 319 * @param minSize 変æ›ã—ãŸã„æ¡æ•°ã®æœ€å°å€¤ 320 * @param maxSize 変æ›ã—ãŸã„æ¡æ•°ã®æœ€å¤§å€¤ 321 * 322 * @return æ•°å—ã ã‘ã§æ§‹æˆã•ã‚Œã‚‹æ–‡å—列(例:20010417154822)(nullã¯ï½¾ï¾žï¾›æ–‡å—列を返ã—ã¾ã™) 323 * @og.rtnNotNull 324 */ 325 public static String parseDate( final String value , final int minSize , final int maxSize ) { 326 if( value == null ) { return ""; } 327 328 // 引数ã®æœ€å¤§é•·ã¯ï½¤14ケタã«åˆ¶é™ã—ã¦ã„ã¾ã™ï½¡ 329 if( maxSize > 14 ) { 330 final String errMsg = "日付登録ã«è¨±å¯ã§ãる最大æ¡æ•°ã¯ï½¤ï¼‘4ケタã§ã™ï½¡" 331 + " maxSize=[" + maxSize + "]" ; 332 throw new OgRuntimeException( errMsg ); 333 } 334 335 final String rtn = parseNumber( value ); 336 final int len = rtn.length() ; 337 338 if( len < minSize || len > maxSize ) { 339 final String errMsg = "日付文å—列ã¯ï½¤æœ€å°[" 340 + minSize + "] ã‹ã‚‰ï½¤æœ€å¤§[" + maxSize + "]ã®ç¯„囲ã§æŒ‡å®šã—ã¦ãã ã•ã„。" 341 + " value=[" + value + "]" ; 342 throw new OgRuntimeException( errMsg ); 343 } 344 345 return rtn ; 346 } 347 348 /** 349 * 日付文å—列ã®åŽ³å¯†ãªæ•´åˆæ€§ï¾ï½ªï½¯ï½¸ã‚’è¡Œã„ã¾ã™ï½¡ 350 * ã“ã“ã§æŒ‡å®šã§ãã‚‹ã®ã¯ï½¤ï¼˜æ–‡å—(yyyyMMdd)、14文å—(yyyyMMddHHmmss)ã®ã©ã¡ã‚‰ã‹ã® 351 * æ•°å—ã ã‘ã®æ—¥ä»˜æ–‡å—列ã§ã‚り、ãã‚ŒãŒï½¤æ—¥ä»˜ã¨ã—ã¦æ£ã—ã„ã‹ã©ã†ã‹ã®ï¾ï½ªï½¯ï½¸ã‚’è¡Œã„ã¾ã™ï½¡ 352 * æ£ã—ã‘ã‚Œã°ï½¤true を、間é•ã£ã¦ã„ã‚Œã°ï½¤false ã‚’è¿”ã—ã¾ã™ï½¡ 353 * ã“ã“ã§ã¯ï½¤20120230(2月3ï¼æ—¥ï¼‰ãªã©ã®æ—¥ä»˜ã‚„、20120101235960 ãªã©ã‚‚ false ã«ãªã‚Šã¾ã™ï½¡ 354 * 引数ãŒï½¤null ãŠã‚ˆã³ï½¤ç©ºæ–‡å—列ã®å ´åˆã‚‚、false ã‚’è¿”ã—ã¾ã™ã®ã§ï½¤é¿ã‘ãŸã„å ´åˆã¯ï½¤äº‹å‰ã« 355 * 判定ã—ã¦ãŠã„ã¦ãã ã•ã„。 356 * 357 * 内部処ç†ã¨ã—ã¦ã¯ï½¤DateFormat ã§ï½¤setLenient( false ) ã‚’è¨å®šã™ã‚‹ã“ã¨ã§ï½¤ 358 * 日付/時刻解æžã‚’厳密ã«è§£æžã™ã‚‹ã«ã—ã¦ï½¤ParseException ãŒç™ºç”Ÿã—ãªã„ã‹ã©ã†ã‹åˆ¤å®šã—ã¦ã„ã¾ã™ï½¡ 359 * 360 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæˆ 361 * 362 * @param value æ•°å—ã ã‘ã§æ§‹æˆã•ã‚Œã‚‹æ—¥ä»˜ã‘æ–‡å—列 363 * 364 * @return true:日付ã¨ã—ã¦æ£ã—ã„å ´åˆ/false:日付ã¨ã—ã¦é–“é•ã£ã¦ã„ã‚‹å ´åˆ 365 */ 366 public static boolean isStrict( final String value ) { 367 if( value == null || value.length() != 8 && value.length() != 14 ) { return false; } // 6.9.7.0 (2018/05/14) PMD Useless parentheses. 368 369 // 日付ã®åŽ³å¯†ãªï¾ï½ªï½¯ï½¸ 370 final String form = value.length() == 8 ? "yyyyMMdd" : "yyyyMMddHHmmss" ; 371 final DateFormat formatter = new SimpleDateFormat( form,Locale.JAPAN ); 372 formatter.setLenient( false ); // 日付/時刻解æžã‚’厳密ã«è¡Œã†(false=厳密) 373 374 boolean flag ; 375 try { 376 formatter.parse( value ); 377 flag = true; 378 } 379 catch( final ParseException ex ) { 380 flag = false; 381 } 382 383 return flag; 384 } 385 386 /** 387 * 日付関係ã®æƒ…å ±ã‚’ç°¡æ˜“çš„ã«å‡¦ç†ã—ã¾ã™ï½¡ 388 * 389 * 引数ã«ä¸Žãˆã‚‹ã®ã¯ï½¤{@DATE.XXXX} ã® XXXX æ–‡å—列ã«ãªã‚Šã¾ã™ï½¡ 390 * ã“ã® "XXXX" æ–‡å—列ã¯ï½¤"key prmA prmB prmC" å½¢å¼ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ï½¡ 391 * å„æ–‡å—列をスï¾ï¾Ÿï½°ï½½ã§åˆ†å‰²ã—ã¦ï½¤å…ˆé ã‹ã‚‰å¤‰æ•°ã«å‰²ã‚Šå½“ã¦ã¾ã™ï½¡ 392 * ã¾ãŸï½¤prmA ã®æ—¥ä»˜æ–‡å—判定ã¨ï½¤æ•°å€¤å¤‰æ›ã¨ï½¤prmC ã®æ•°å€¤å¤‰æ›ã‚‚è¡Œã„ã¾ã™ï½¡ 393 * ãŸã ã—、リクエスト変数㮠@ æ–‡å—列変æ›ã¯ï½¤å‡ºæ¥ã¾ã›ã‚“。 394 * 395 * @og.rev 6.9.2.1 (2018/03/12) æ–°è¦è¿½åŠ 396 * 397 * @param value 日付引数ã®ï¾Šï¾Ÿï¾—ï¾’ï½°ï¾€ 398 * 399 * @return ï¾’ï½¯ï½¾ï½°ï½¼ï¾žæƒ…å ± 400 * @og.rtnNotNull 401 * @see #getDateFormat( String , String ,String , int ) 402 */ 403 public static String getDateFormat( final String value ) { 404 // {@DATE.XXXX AA BB CC} を分割 405 final String[] vals = StringUtil.csv2Array( value,' ' ); // ダブルクオート内ã¯ä¿æŒã•ã‚Œã‚‹ï½¡ 406 407 final String key = vals[0] ; 408 409 String prmA = vals.length >= 2 ? vals[1] : null ; 410 String prmB = vals.length >= 3 ? vals[2] : null ; 411 String prmC = vals.length >= 4 ? vals[vals.length-1] : null ; // 互æ›æ€§ï½¡æœ€å¾Œã®å€¤ãŒï½¤CC引数 412 413 // AA 引数ã®ï½ºï¾ï¾ï¾„゙判定方法(先é ãŒæ•°å—以外) 414 if( StringUtil.isNotNull( prmA ) ) { 415 final char chA = prmA.charAt(0); 416 if( chA < '0' || chA > '9' ) { // å…ˆé ãŒï½¤æ•°å—以外ã®å ´åˆã¯ï½¤ï½ºï¾ï¾ï¾„゙ãªã®ã§ï½¤ä¸€ã¤ãšã¤ãšã‚‰ã™ï½¡ 417 prmC = prmB; 418 prmB = prmA; 419 prmA = null; 420 } 421 } 422 423 // CC 引数を、"H" , "D" , "M" 以外ã§ã‚‚使用ã§ãるよã†ã«æ‹¡å¼µã—ã¾ã™ï½¡ 424 int intC = 0; 425 if( StringUtil.isNotNull( prmC ) ) { 426 try { 427 intC = Integer.parseInt( prmC ); 428 } 429 catch( final NumberFormatException ex ) { 430 final String errMsg = "CC引数ãŒæ•°å—ã§ã¯ã‚ã‚Šã¾ã›ã‚“。value=[" + value + "]" 431 + ex.getMessage() ; 432 System.err.println( errMsg ); 433 } 434 } 435 436 // prmA ㌠null ã‹ï½¤isEmpty() ã®å ´åˆã¯ï½¤ç¾åœ¨æ™‚刻ãŒä½¿ç”¨ã•ã‚Œã‚‹ï½¡ 437 return getDateFormat( key,prmA,prmB,intC ); 438 } 439 440 /** 441 * 日付関係ã®æƒ…å ±ã‚’ç°¡æ˜“çš„ã«å‡¦ç†ã—ã¾ã™ï½¡ 442 * 443 * 処ç†ï½ºï¾ï¾ï¾„゙ã¨ï½¤CC引数ã®åŠ 減算パラメータを使用ã—ãªã„バージョï¾ã§ã™ï½¡ 444 * 445 * @og.rev 6.9.2.1 (2018/03/12) メソッドã®å¼•æ•°ã‚’ç°¡ç´ åŒ– 446 * 447 * @param key フォーï¾ï½¯ï¾„ã®äºˆç´„語 448 * @param prmA 基準ã¨ãªã‚‹æ—¥ä»˜(nullã®å ´åˆã¯ï½¤å‡¦ç†æ™‚刻) 449 * 450 * @return ï¾’ï½¯ï½¾ï½°ï½¼ï¾žæƒ…å ± 451 * @og.rtnNotNull 452 * @see #getDateFormat( String , String ,String , int ) 453 */ 454 public static String getDateFormat( final String key , final String prmA ) { 455 return getDateFormat( key,prmA,null,0 ); 456 } 457 458// /** 459// * 日付関係ã®æƒ…å ±ã‚’ç°¡æ˜“çš„ã«å‡¦ç†ã—ã¾ã™ï½¡ 460// * 461// * CC引数ã®åŠ 減算パラメータã¯ï½¤0 ã§ã™ï½¡ 462// * 463// * @og.rev 5.7.4.1 (2014/03/14) CC 引数を拡張ã™ã‚‹ãŸã‚、旧メソッドをå†ç¾ã—ã¦ãŠãã¾ã™ï½¡ 464// * @og.rev 6.9.2.1 (2018/03/12) å»ƒæ¢ 465// * 466// * @param key フォーï¾ï½¯ï¾„ã®äºˆç´„語 467// * @param prmA 基準ã¨ãªã‚‹æ—¥ä»˜(nullã®å ´åˆã¯ï½¤å‡¦ç†æ™‚刻) 468// * @param prmB 処ç†ï½ºï¾ï¾ï¾„゙ 469// * 470// * @return ï¾’ï½¯ï½¾ï½°ï½¼ï¾žæƒ…å ± 471// * @og.rtnNotNull 472// * @see #getDateFormat( String , String ,String , int ) 473// */ 474// public static String getDateFormat( final String key ,final String prmA ,final String prmB ) { 475// return getDateFormat( key,prmA,prmB,0 ); 476// } 477 478 /** 479 * 日付関係ã®æƒ…å ±ã‚’ç°¡æ˜“çš„ã«å‡¦ç†ã—ã¾ã™ï½¡ 480 * 481 * 第一引数(key) "XXXX" ã¯ï½¤æ—¥ä»˜å‡¦ç†ã‚’è¡Œã†ï¾Œï½«ï½°ï¾ï½¯ï¾„ã®äºˆç´„語ã«ãªã£ã¦ã„ã¾ã™ï½¡ 482 * ï½¥Y4 :4文å—ã®å¹´ï¾ƒï¾žï½°ï¾€(yyyy)を扱ã„ã¾ã™ï½¡ 483 * ï½¥YMD :8文å—ã®4-2-2年月日データ(yyyyMMdd)を扱ã„ã¾ã™ï½¡ 484 * ï½¥Y2MD :6文å—ã®2-2-2年月日データ(yyMMdd)を扱ã„ã¾ã™ï½¡ 485 * ï½¥YM :6文å—ã®4-2年月データ(yyyyMM)を扱ã„ã¾ã™ï½¡ 486 * ï½¥MD :4文å—ã®æœˆæ—¥ï¾ƒï¾žï½°ï¾€(MMdd)を扱ã„ã¾ã™ï½¡ 487 * ï½¥HMS :6文å—ã®2-2-2時分秒データ(HHmmss)を扱ã„ã¾ã™ï½¡ 488 * ï½¥HM :4文å—ã®2-2時分データ(HHmm)を扱ã„ã¾ã™ï½¡6.7.4.1 (2017/02/17) 489 * ï½¥YMDHMS :14文å—ã®4-2-2-2-2-2年月日時分秒データ(yyyyMMddHHmmss)を扱ã„ã¾ã™ï½¡ 490 * ï½¥YMDHM :12文å—ã®4-2-2-2-2年月日時分データ(yyyyMMddHHmm)を扱ã„ã¾ã™ï½¡ 491 * ï½¥YMDH :1ï¼æ–‡å—ã®4-2-2-2年月日時データ(yyyyMMddHH)を扱ã„ã¾ã™ï½¡ 492 * ï½¥EEE :曜日をデフォルトロケールã§è¡¨ç¤ºã—ã¾ã™ï½¡ 493 * 494 * F付ãã¯ï½¤ï¾Œï½«ï½°ï¾ï½¯ï¾„ã•ã‚ŒãŸæ—¥ä»˜ã‚’è¿”ã—ã¾ã™ï½¡ 495 * ï½¥YMDF :1ï¼æ–‡å—ã®æ—¥ä»˜è¡¨ç¾(yyyy/MM/dd)を扱ã„ã¾ã™ï½¡ 496 * ï½¥YMD-F :HTML5 type="date" ã®æ—¥ä»˜è¡¨ç¾(yyyy-MM-dd)を扱ã„ã¾ã™ï½¡8.0.1.2 (2021/11/19) 497 * ï½¥Y2MDF :8文å—ã®æ—¥ä»˜è¡¨ç¾(yy/MM/dd)を扱ã„ã¾ã™ï½¡ 498 * ï½¥YMF :7文å—ã®æ—¥ä»˜è¡¨ç¾(yyyy/MM)を扱ã„ã¾ã™ï½¡ 499 * ï½¥YM-F :HTML5 type="month"ã®æ—¥ä»˜è¡¨ç¾(yyyy-MM)を扱ã„ã¾ã™ï½¡8.0.1.2 (2021/11/19) 500 * ï½¥HMSF :8文å—ã®æ™‚刻表ç¾(HH:mm:ss)を扱ã„ã¾ã™ï½¡ 501 * ï½¥HMF :5文å—ã®æ™‚刻表ç¾(HH:mm)を扱ã„ã¾ã™ï½¡6.7.4.1 (2017/02/17) 502 * ï½¥YMDHMSF:19文å—ã®æ—¥ä»˜è¡¨ç¾(yyyy/MM/dd HH:mm:ss)を扱ã„ã¾ã™ï½¡ 503 * ï½¥YMDHMF :17文å—ã®æ—¥ä»˜è¡¨ç¾(yyyy/MM/dd HH:mm)を扱ã„ã¾ã™ï½¡ 504 * ï½¥YMDHM-F:17文å—ã®æ—¥ä»˜è¡¨ç¾(yyyy-MM-ddTHH:mm)を扱ã„ã¾ã™ï½¡8.0.1.2 (2021/11/19) 505 * ï½¥MDF :5文å—ã®æœˆæ—¥è¡¨ç¾(MM/dd)を扱ã„ã¾ã™ï½¡ 506 * ï½¥MDEF :5文å—+曜日ã®æœˆæ—¥è¡¨ç¾(MM/dd(EEE))を扱ã„ã¾ã™ï½¡ 507 * ï½¥MDHMF :11文å—ã®æœˆæ—¥æ™‚分表ç¾(MM/dd HH:mm)を扱ã„ã¾ã™ï½¡ (7.0.0.1 (2018/10/09) è¿½åŠ ) 508 * ï½¥MD2F :漢å—ã®æœˆæ—¥è¡¨ç¾(MM月ddæ—¥)を扱ã„ã¾ã™ï½¡(5.5.5.2 è¿½åŠ ) 509 * ï½¥HM2F :漢å—ã®æ™‚分表ç¾(HH時mm分)を扱ã„ã¾ã™ï½¡(7.0.0.1 (2018/10/09) è¿½åŠ ) 510 * ï½¥MDHM2F :漢å—ã®æœˆæ—¥æ™‚分表ç¾(MM月ddæ—¥ HH時mm分)を扱ã„ã¾ã™ï½¡(7.0.0.1 (2018/10/09) è¿½åŠ ) 511 * ï½¥GYMDF :和暦ã®å¹´æœˆæ—¥è¡¨ç¾(GGGGyyyyå¹´MM月ddæ—¥)を扱ã„ã¾ã™ï½¡ 512 * ï½¥G2YMDF :和暦ã®æ—¥ä»˜è¡¨ç¾(Gyyyy/MM/dd)を扱ã„ã¾ã™ï½¡ 513 * ï½¥GYMF :和暦ã®å¹´æœˆè¡¨ç¾(GGGGyyyyå¹´MM月)を扱ã„ã¾ã™ï½¡ 514 * ï½¥GYF :和暦ã®å¹´è¡¨ç¾(GGGGyyyy)を扱ã„ã¾ã™ï½¡ 515 * 516 * ï½¥DIFF :日付ã®å·®åˆ†ã‚’求ã‚ã¾ã™ï½¡(7.0.1.1 (2018/10/22) è¿½åŠ ) 517 * AA - BB を求ã‚、CCã®æ•°å€¤ã§å˜ä½ã‚’指定ã—ã¾ã™ï½¡ 518 * 519 * ãªãŠï½¤ä¸Šè¨˜ä»¥å¤–ã®ï¾Œï½«ï½°ï¾ï½¯ï¾„を指定ã™ã‚‹å ´åˆã¯ï½¤XXXX部分ã«ç›´æŽ¥è¨˜è¿°ã§ãã¾ã™ï½¡(5.5.5.2 è¿½åŠ ) 520 * ãŸã ã—、基本的ã«ã¯ï½¤è‡ªç”±ï¾Œï½«ï½°ï¾ï½¯ï¾„ã¯ï½¤ï½´ï¾—ï½°ï¾ï½ªï½¯ï½¸ãŒãªã„為、使ã‚ãªã„ã§ãã ã•ã„。 521 * 522 * 第二引数(prmA) AA ã¯ï½¤åŸºæº–ã¨ãªã‚‹æ—¥ä»˜ã‚’、yyyyMMddå½¢å¼ã§æŒ‡å®šã—ã¾ã™ï½¡nullã®å ´åˆã¯ï½¤ç¾åœ¨æ™‚刻を使用ã—ã¾ã™ï½¡ 523 * 指定ã§ãる日付ã¯ï½¤yyyyMMddå½¢å¼ã‚’推奨ã—ã¾ã™ãŒï½¤'/' , '-' , ' ' , ':' を削除ã—ã¦ä½¿ã„ã¾ã™ï½¡ 524 * ï¼–æ¡ã®å ´åˆã¯ï½¤yyyyMM + 01 ã¨ã—、8ケタã®å ´åˆã¯ï½¤yyyyMMdd ã¨ã—、14ケタ以上ã®å ´åˆã¯ï½¤å‰åŠï¼‘4文å—ã‚’ 525 * yyyyMMddHHmmss ã¨ã—ã¦å‡¦ç†ã—ã¾ã™ï½¡ãれ以外ã®æ¡æ•°ã®å ´åˆã¯ï½¤ï½´ï¾—ï½°ã«ãªã‚Šã¾ã™ï½¡ 526 * ãŸã¨ãˆã°ï½¤"2012/09/05 16:52:36" ã®ã‚ˆã†ãªï¾Œï½«ï½°ï¾ï½¯ï¾„データã®å ´åˆï½¤'/' , '-' , ' ' , ':' を削除ã—㦠527 * "20120905165236" ã«å¤‰æ›å¾Œï½¤æ—¥ä»˜ï½µï¾Œï¾žï½¼ï¾žï½ªï½¸ï¾„ã«å¤‰æ›ã•ã‚Œã¾ã™ï½¡ 528 * 529 * 第三引数(prmB) BB ã¯ï½¤æ—¥ä»˜ã«ã¤ã„ã¦ã®åŠ 減算処ç†ã‚’è¡Œã†ãŸã‚ã®ï½ºï¾ï¾ï¾„゙を指定ã—ã¾ã™ï½¡ 530 * nullã®å ´åˆã¯ï½¤ãªã«ã‚‚åŠ æ¸›ç®—å‡¦ç†ã‚’è¡Œã„ã¾ã›ã‚“。 531 * ï½¥SY :当年ã®æœ€åˆã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(当年1月1日)。CC引数ã¯ï½¤-N:Nå¹´å‰ï½¤0:当年(=SY)、N:N年後 6.9.2.1 (2018/03/12) 532 * ï½¥SD :当月ã®æœ€åˆã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(当月1日)。CC引数ã¯ï½¤-N:N月å‰ï½¤0:当月(=SD)、N:N月後、-1:BSD ã¨åŒã˜ï½¤1:ASD ã¨åŒã˜ 533 * ï½¥SW :日付処ç†ã®é€±åˆã‚(月曜日)ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡æ—¥ä»˜ã¯å½“日よりå‰ã«ç§»å‹•ã—ã¾ã™ï½¡CC引数ã¯ï½¤-N:N週å‰ï½¤0:今週(=SW)、N:N週後 534 * ï½¥SH :指定ã®æœ€åˆã®æ™‚ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(分秒を0000ã«ã™ã‚‹)。CC引数ã¯ï½¤æ™‚ã®å€æ•°(4ã¨æŒ‡å®šã™ã‚Œã°ï½¤4時間å˜ä½ã«å‰ã«æˆ»ã‚‹) 6.7.4.1 (2017/02/17) 535 * ï½¥SM :指定ã®æœ€åˆã®åˆ†ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(秒を00ã«ã™ã‚‹)。CC引数ã¯ï½¤åˆ†ã®å€æ•°(15ã¨æŒ‡å®šã™ã‚Œã°ï½¤15分å˜ä½ã«å‰ã«æˆ»ã‚‹) 6.7.4.1 (2017/02/17) 536 * ï½¥SS :指定ã®æœ€åˆã®ç§’ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡CC引数ã¯ï½¤ç§’ã®å€æ•°(15ã¨æŒ‡å®šã™ã‚Œã°ï½¤15秒å˜ä½ã«å‰ã«æˆ»ã‚‹) 6.7.4.1 (2017/02/17) 537 * ï½¥EY :当年ã®æœ€å¾Œã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(当年年末)。CC引数ã¯ï½¤-N:Nå¹´å‰ï½¤0:当年(=EY)、N:N年後 6.9.2.1 (2018/03/12) 538 * ï½¥ED :当月ã®æœ€å¾Œã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(当月月末)。CC引数ã¯ï½¤-N:N月å‰ï½¤0:当月(=ED)、N:N月後、-1:BED ã¨åŒã˜ï½¤1:AED ã¨åŒã˜ 539 * ï½¥EW :日付処ç†ã®é€±æœ«(日曜日)ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡æ—¥ä»˜ã¯å½“日より後ã‚ã«ç§»å‹•ã—ã¾ã™ï½¡CC引数ã¯ï½¤-N:N週å‰ï½¤0:今週(=EW)、N:N週後 540 * ï½¥EH :指定ã®æ¬¡ã®æ™‚ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(分秒を0000ã«ã—ãŸæ¬¡ã®æ™‚)。CC引数ã¯ï½¤æ™‚ã®å€æ•°(4ã¨æŒ‡å®šã™ã‚Œã°ï½¤4時間å˜ä½ã«å‰ã«é€²ã‚€) 6.7.4.1 (2017/02/17) 541 * ï½¥EM :指定ã®æ¬¡ã®åˆ†ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(秒を00ã«ã—ãŸæ¬¡ã®åˆ†)。CC引数ã¯ï½¤åˆ†ã®å€æ•°(15ã¨æŒ‡å®šã™ã‚Œã°ï½¤15分å˜ä½ã«å‰ã«é€²ã‚€) 6.7.4.1 (2017/02/17) 542 * ï½¥ES :指定ã®æ¬¡ã®ç§’ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡CC引数ã¯ï½¤ç§’ã®å€æ•°(15ã¨æŒ‡å®šã™ã‚Œã°ï½¤15秒å˜ä½ã«å‰ã«é€²ã‚€) 6.7.4.1 (2017/02/17) 543 * ï½¥M1 ~ MXXX :月を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡M1ãªã‚‰ç¿Œæœˆï½¤M6 ãªã‚‰åŠå¹´å¾Œ 544 * ï½¥D1 ~ DXXX :日を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡D1ãªã‚‰ç¿Œæ—¥ï½¤D200 ãªã‚‰200日後 545 * ï½¥H1 ~ HXXX :時を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡H1ãªã‚‰ï¼‘時間後、H24 ãªã‚‰ï¼’4時間後(5.5.5.6 (2012/08/31) è¿½åŠ ) 546 * ï½¥MI :分を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡ç¬¬å››å¼•æ•°(intC) ã§ï½¤æ™‚間を指定ã—ã¾ã™ï½¡(6.8.4.1 (2017/12/18) è¿½åŠ ) 547 * ï½¥YMD :CC 引数ã®YMD表記ã®æ—¥ä»˜ã‚’åŠ æ¸›ç®—ã—ã¾ã™ï½¡6.8.4.1 (2017/12/18) è¿½åŠ 548 * ï½¥HM :CC 引数ã®HM表記ã®æ™‚åˆ»ã‚’åŠ æ¸›ç®—ã—ã¾ã™ï½¡6.8.4.1 (2017/12/18) è¿½åŠ 549 * ï½¥NO :AA 引数ãŒnullã®å ´åˆï½¤ç¾åœ¨æ™‚刻ã§ã¯ãªã空文å—列ã«ã—ã¾ã™ï½¡ 7.0.1.3 (2018/11/12) è¿½åŠ 550 * ï½¥(有閑)BSD :先月ã®æœ€åˆã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(先月1日)(5.5.5.2 è¿½åŠ )。SD -1 ã¨åŒç‰ 551 * ï½¥(有閑)BED :先月ã®æœ€å¾Œã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(先月月末)(5.5.5.2 è¿½åŠ )。ED -1 ã¨åŒç‰ 552 * ï½¥(有閑)ASD :翌月ã®æœ€åˆã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(翌月1日)(5.5.5.2 è¿½åŠ )。SD 1 ã¨åŒç‰ 553 * ï½¥(有閑)AED :翌月ã®æœ€å¾Œã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(翌月月末)(5.5.5.2 è¿½åŠ )。ED 1 ã¨åŒç‰ 554 * 555 * 7.0.1.1 (2018/10/22) 556 * DATE.DIFF ã®å ´åˆï½¤BB 引数ã¯ï½¤æ—¥ä»˜ï¾ƒï¾žï½°ï¾€ã«ãªã‚Šã¾ã™ï½¡AA-BB ã®é–¢ä¿‚ã§ã™ï½¡ 557 * 558 * CC 引数ã¯ï½¤ç‰¹åˆ¥ãªå‡¦ç†ã§ï½¤BB 引数ã«å¯¾ã—ã¦ï½¤åŠ 算、減算ã®ãŸã‚ã®æ•°å—を指定ã§ãã¾ã™ï½¡(5.7.4.1 (2014/03/14) è¿½åŠ ) 559 * 従æ¥ã¯ï½¤BB 引数ãŒï½¤"H" , "D" , "M" 㮠1文å—パラメータã®å ´åˆã®ã¿åˆ©ç”¨å¯èƒ½ã§ã—ãŸï½¡ 560 * ã“ã‚Œã¯ï½¤"H15" ã¨æŒ‡å®šã™ã‚‹ã®ã¨ï½¤"H" "15" ã¨æŒ‡å®šã™ã‚‹ã®ã¨åŒã˜æ„味ã«ãªã‚Šã¾ã™ï½¡ 561 * ç•°ãªã‚‹ã®ã¯ï½¤CC 引数も、(@CC)指定ã§ï½¤ï¾˜ï½¸ï½´ï½½ï¾„パラメータãŒä½¿ç”¨ã§ãã¾ã™ï½¡ 562 * 従æ¥ã¯ï½¤æ–‡å—列ã¨ã—ã¦çµåˆã•ã‚ŒãŸçŠ¶æ…‹ã§ã—ã‹ï½¤BB 引数を渡ã›ã¾ã›ã‚“ã§ã—ãŸãŒï½¤ã“ã®ï½¤CC 引数㮠563 * è¿½åŠ ã§ï½¤æ—¥ä»˜ã®åŠ 減算を、パラメータ指定ã§ãるよã†ã«ãªã‚Šã¾ã™ï½¡ 564 * æ•°å—以外ã®æ–‡å—ãŒæŒ‡å®šã•ã‚ŒãŸã‚Šï½¤ï¾Šï¾Ÿï¾—ï¾’ï½°ï¾€ã®è§£æžçµæžœãŒ NULL ã®å ´åˆã«ã¯ï½¤BB引数自体も無視ã•ã‚Œã¾ã™ï½¡ 565 * 注æ„点ã¯ï½¤å„ BB 引数ã«å¿œã˜ã¦ï½¤æ•°å—ã®æ„味ãŒç•°ãªã‚‹ã¨ã„ã†äº‹ã§ã™ï½¡ 566 * 567 * HXXX,DXXX,MXXX å½¢å¼ã«ï½¤CC 引数を付ã‘ãŸå ´åˆã¯ï½¤XXX ã«ã•ã‚‰ã«åŠ ç®—ã•ã‚Œã¾ã™ï½¡ 568 * prmB ã«ï½¤æ•°å—を使用ã—ãŸå ´åˆï½¤(コï¾ï¾ï¾„゙ã§ãªã„å ´åˆ)ã«ã‚‚、CC 引数ã¯ï½¤åŠ ç®—ã•ã‚Œã¾ã™ï½¡ 569 * 570 * 7.0.1.1 (2018/10/22) 571 * DATE.DIFF ã®å ´åˆï½¤CC 引数ã¯ï½¤å·®åˆ†ã®å˜ä½ã‚’指定ã™ã‚‹ï½·ï½°ï¾œï½°ï¾„゙ã«ãªã‚Šã¾ã™ï½¡AA-BB ã®çµæžœã‚’、 572 * 1:å¹´ 2:月 3:æ—¥ 4:時 5:分 6:秒 ã«æ›ç®— ã—ã¦è¿”ã—ã¾ã™ï½¡ç«¯æ•°ã¯åˆ‡ã‚Šæ¨ã¦ã§æ•´æ•°ã§è¿”ã—ã¾ã™ï½¡ 573 * 574 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæˆ 575 * @og.rev 5.6.1.1 (2013/02/08) prmB処ç†ã‚’、calendarCalc メソッドã¸ç§»å‹• 576 * @og.rev 5.7.4.1 (2014/03/14) CC 引数を拡張 577 * @og.rev 6.4.3.3 (2016/03/04) Map#getOrDefault ã§å¯¾å¿œã™ã‚‹ï½¡ 578 * @og.rev 7.0.1.1 (2018/10/22) DATE.DIFF è¿½åŠ 579 * @og.rev 7.0.1.3 (2018/11/12) BB 引数㫠NOè¿½åŠ 580 * @og.rev 8.0.1.2 (2021/11/19) 日付フォーï¾ï½¯ï¾„(key引数)ã«ã€\\næ–‡å—列ãŒå«ã¾ã‚Œã‚‹å ´åˆã€å¤‰æ›ã—ã¦ãŠãã¾ã™ã€‚ 581 * @og.rev 8.5.3.2 (2023/10/13) JDK21対応。 è¦å‘Š: [deprecation] Localeã®Locale(String,String,String)ã¯æŽ¨å¥¨ã•ã‚Œã¾ã›ã‚“ 582 * 583 * @param key フォーï¾ï½¯ï¾„ã®äºˆç´„語 584 * @param prmA 基準ã¨ãªã‚‹æ—¥ä»˜(nullã®å ´åˆã¯ï½¤å‡¦ç†æ™‚刻) 585 * @param prmB 処ç†ï½ºï¾ï¾ï¾„゙ 586 * @param intC åŠ æ¸›ç®—å‡¦ç†ã‚’è¡Œã†ãŸã‚ã®æ•°å—。0 ã¯ï½¤BB引数ã®å¾“æ¥è¨ˆç®—ã®ã¾ã¾ï½¡ 587 * 588 * @return ï¾’ï½¯ï½¾ï½°ï½¼ï¾žæƒ…å ± 589 * @og.rtnNotNull 590 * @see #getDateFormat( String ) 591 * @see #getDateFormat( String , String ) 592 * @see #getCalendar( String ) AA 引数 ã‹ã‚‰ï½¶ï¾šï¾ï¾€ï¾žï½µï¾Œï¾žï½¼ï¾žï½ªï½¸ï¾„を作æˆã—ã¾ã™ï½¡ 593 * @see #calendarCalc( Calendar , String , int ) BB 引数、CC 引数を元ã«ï½¤æ—¥ä»˜è¨ˆç®—ã—ã¾ã™ï½¡ 594 */ 595 public static String getDateFormat( final String key ,final String prmA ,final String prmB ,final int intC ) { 596 // 7.0.1.3 (2018/11/12) prmA ㌠null ã®å ´åˆã§ï½¤prmB ㌠"NO" ã®å ´åˆã¯ï½¤ï½¾ï¾žï¾›æ–‡å—列を返ã—ã¾ã™ï½¡ 597 if( StringUtil.isEmpty( prmA ) && "NO".equalsIgnoreCase( prmB ) ) { 598 return ""; 599 } 600 601 // prmA ㌠null ã®å ´åˆã¯ï½¤ãã®ã¾ã¾ï½¤ç¾åœ¨æ™‚刻ãŒä½¿ã‚ã‚Œã¾ã™ï½¡ 602 final Calendar now = getCalendar( prmA ); 603 604 // 7.0.1.1 (2018/10/22) DATE.DIFF è¿½åŠ 605 if( "DIFF".equalsIgnoreCase( key ) ) { 606 return calendarDiff( now,prmB,intC ); 607 } 608 609 // 5.6.1.1 (2013/02/08) getDateFormat( String ,String ,String ) ã‹ã‚‰åˆ†é›¢ï½¡ 610 calendarCalc( now,prmB,intC ); // 5.7.4.1 (2014/03/14) CC 引数を拡張 611 612 // DATE_FORMAT ã«å˜åœ¨ã—ãªã„フォーï¾ï½¯ï¾„を指定ã—ã¦ã‚‚、エラーã«ã—ã¾ã›ã‚“。 613 // ãŸã ã—、後処ç†ã§ï¾Œï½«ï½°ï¾ï½¯ï¾„ï½´ï¾—ï½°ã«ãªã‚‹å¯èƒ½æ€§ã¯æ®‹ã‚Šã¾ã™ï½¡ 614 // 6.4.3.3 (2016/03/04) Map#getOrDefault を使用ã—ã¾ã™ï½¡ 615 // 8.0.1.2 (2021/11/19) 日付フォーï¾ï½¯ï¾„(key引数)ã«ã€\\næ–‡å—列ãŒå«ã¾ã‚Œã‚‹å ´åˆã€å¤‰æ›ã—ã¦ãŠãã¾ã™ã€‚ 616// final String format = DATE_FORMAT.getOrDefault( key,key ); // 後ã‚ã® key ã¯ï½¤å€¤ãŒ null ã®ã¨ãã®åˆæœŸå€¤ 617 final String format ; 618 if( key.contains( "\\n" ) ) { 619 format = key.replace( "\\n" , "\n" ); // \\n ã‚’å«ã‚€ãªã‚‰ã€DATE_FORMAT ã«ã¯å˜åœ¨ã—ãªã„ãƒã‚ºã€‚ 620 } 621 else { 622 format = DATE_FORMAT.getOrDefault( key,key ); 623 } 624 625 // 5.5.0.2 å…ˆé Gã®å ´åˆã¯å’Œæš¦ãªã®ã§formatterã®Localeを変更ã™ã‚‹ 626 DateFormat formatter = null; 627 if( key.indexOf('G') == 0 ){ 628// formatter = new SimpleDateFormat( format, new Locale("ja","JP","JP")); 629 formatter = new SimpleDateFormat( format, JA_JP_JP); // 8.5.3.2 (2023/10/13) JDK21対応 630 } 631 else{ 632 formatter = new SimpleDateFormat( format,Locale.JAPAN ); 633 } 634 635 return formatter.format( now.getTime() ); 636 } 637 638 /** 639 * 指定ã®ã®æ–‡å—列ã‹ã‚‰ã€ã‚«ãƒ¬ãƒ³ãƒ€ã‚ªãƒ–ジェクトを作æˆã—ã¾ã™ã€‚ 640 * 基準ã¨ãªã‚‹æ—¥ä»˜ã«è¨ˆç®—ã—ãŸçµæžœã‚’åæ˜ ã•ã›ã¾ã™ã€‚ 641 * 642 * prmB ã¯ã€æ—¥ä»˜ã«ã¤ã„ã¦ã®åŠ 減算処ç†ã‚’è¡Œã†ãŸã‚ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’指定ã—ã¾ã™ã€‚ 643 * ãƒ»æ•°å— ï¼šHHMM å½¢å¼ã®æ™‚分ã§ã™ã€‚ 644 * ・H1 ~ HXXX :ç¾åœ¨æ™‚刻ã«æ•°å—部分を+ï¼ã—ã¾ã™ã€‚分ã¯ï¼ã«åˆæœŸåŒ–ã•ã‚Œã¾ã™ã€‚ 645 * 646 * @og.rev 8.5.4.2 (2024/01/12) Calendar ï½²ï¾ï½½ï¾€ï¾ï½½ã®ä½œæˆæ–¹æ³•å¤‰æ›´( HybsDateUtil.newCalendar( String ) ã«ç§»è¡Œ 647 * 648 * @param prmB 処ç†ã‚³ãƒžãƒ³ãƒ‰ 649 * @return カレンダオブジェクト 650 */ 651 public static Calendar newCalendar( final String prmB ) { 652 final Calendar cal = Calendar.getInstance(); 653 654 final boolean nowBase = prmB.charAt(0) == 'H' ; 655 656 if( nowBase ) { 657 final int hour = Integer.parseInt( prmB.substring( 1 ) ); 658 cal.add( Calendar.HOUR_OF_DAY,hour ); 659 cal.set( Calendar.MINUTE ,0 ); 660 cal.set( Calendar.SECOND ,0 ); 661 } 662 else { 663 final int hour = Integer.parseInt( prmB.substring( 0,2 ) ); 664 final int minute = Integer.parseInt( prmB.substring( 2,4 ) ); 665 cal.set( Calendar.HOUR_OF_DAY,hour ); 666 cal.set( Calendar.MINUTE ,minute ); 667 cal.set( Calendar.SECOND ,0 ); 668 } 669 670 return cal; 671 } 672 673 /** 674 * 開始å‰è¨å®šå€¤ï½¤ã¾ãŸã¯ 終了後è¨å®šå€¤ã®æ–‡å—列ã‹ã‚‰ï½¤ï½µï¾Œï¾Ÿï½¼ï½®ï¾æ–‡å—列をåˆæˆã—ã¾ã™ï½¡ 675 * 基準ã¨ãªã‚‹æ—¥ä»˜ã«è¨ˆç®—ã—ãŸçµæžœã‚’åæ˜ ã•ã›ã¾ã™ï½¡ 676 * 677 * CC引数ã®åŠ 減算パラメータã¯ï½¤0 ã§ã™ï½¡ 678 * 679 * @og.rev 5.7.4.1 (2014/03/14) CC 引数を拡張ã™ã‚‹ãŸã‚、旧メソッドをå†ç¾ã—ã¦ãŠãã¾ã™ï½¡ 680 * 681 * @param now 基準ã¨ãªã‚‹æ—¥ä»˜ï¼ˆCalendarオブジェクト) 682 * @param prmB 処ç†ï½ºï¾ï¾ï¾„゙ 683 */ 684 public static void calendarCalc( final Calendar now,final String prmB ) { 685 calendarCalc( now,prmB,0 ); 686 } 687 688 /** 689 * 開始å‰è¨å®šå€¤ï½¤ã¾ãŸã¯ 終了後è¨å®šå€¤ã®æ–‡å—列ã‹ã‚‰ï½¤ï½µï¾Œï¾Ÿï½¼ï½®ï¾æ–‡å—列をåˆæˆã—ã¾ã™ï½¡ 690 * 基準ã¨ãªã‚‹æ—¥ä»˜ã«è¨ˆç®—ã—ãŸçµæžœã‚’åæ˜ ã•ã›ã¾ã™ï½¡ 691 * 692 * prmB ã¯ï½¤æ—¥ä»˜ã«ã¤ã„ã¦ã®åŠ 減算処ç†ã‚’è¡Œã†ãŸã‚ã®ï½ºï¾ï¾ï¾„゙を指定ã—ã¾ã™ï½¡ 693 * ï½¥SY :当年ã®æœ€åˆã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(当年1月1日)。CC引数ã¯ï½¤-N:Nå¹´å‰ï½¤0:当年(=SY)、N:N年後 6.9.2.1 (2018/03/12) 694 * ï½¥SD :当月ã®æœ€åˆã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(当月1日)。CC引数ã¯ï½¤-N:N月å‰ï½¤0:当月(=SD)、N:N月後、-1:BSD ã¨åŒã˜ï½¤1:ASD ã¨åŒã˜ 695 * ï½¥SW :日付処ç†ã®é€±åˆã‚(月曜日)ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡æ—¥ä»˜ã¯å½“日よりå‰ã«ç§»å‹•ã—ã¾ã™ï½¡CC引数ã¯ï½¤-N:N週å‰ï½¤0:今週(=SW)、N:N週後 696 * ï½¥SH :指定ã®æœ€åˆã®æ™‚ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(分秒を0000ã«ã™ã‚‹)。CC引数ã¯ï½¤æ™‚ã®å€æ•°(4ã¨æŒ‡å®šã™ã‚Œã°ï½¤4時間å˜ä½ã«å‰ã«æˆ»ã‚‹) 6.7.4.1 (2017/02/17) 697 * ï½¥SM :指定ã®æœ€åˆã®åˆ†ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(秒を00ã«ã™ã‚‹)。CC引数ã¯ï½¤åˆ†ã®å€æ•°(15ã¨æŒ‡å®šã™ã‚Œã°ï½¤15分å˜ä½ã«å‰ã«æˆ»ã‚‹) 6.7.4.1 (2017/02/17) 698 * ï½¥SS :指定ã®æœ€åˆã®ç§’ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡CC引数ã¯ï½¤ç§’ã®å€æ•°(15ã¨æŒ‡å®šã™ã‚Œã°ï½¤15秒å˜ä½ã«å‰ã«æˆ»ã‚‹) 6.7.4.1 (2017/02/17) 699 * ï½¥EY :当年ã®æœ€å¾Œã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(当年年末)。CC引数ã¯ï½¤-N:Nå¹´å‰ï½¤0:当年(=EY)、N:N年後 6.9.2.1 (2018/03/12) 700 * ï½¥ED :当月ã®æœ€å¾Œã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(当月月末)。CC引数ã¯ï½¤-N:N月å‰ï½¤0:当月(=ED)、N:N月後、-1:BED ã¨åŒã˜ï½¤1:AED ã¨åŒã˜ 701 * ï½¥EW :日付処ç†ã®é€±æœ«(日曜日)ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡æ—¥ä»˜ã¯å½“日より後ã‚ã«ç§»å‹•ã—ã¾ã™ï½¡CC引数ã¯ï½¤-N:N週å‰ï½¤0:今週(=EW)、N:N週後 702 * ï½¥EH :指定ã®æ¬¡ã®æ™‚ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(分秒を0000ã«ã—ãŸæ¬¡ã®æ™‚)。CC引数ã¯ï½¤æ™‚ã®å€æ•°(4ã¨æŒ‡å®šã™ã‚Œã°ï½¤4時間å˜ä½ã«å‰ã«é€²ã‚€) 6.7.4.1 (2017/02/17) 703 * ï½¥EM :指定ã®æ¬¡ã®åˆ†ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(秒を00ã«ã—ãŸæ¬¡ã®åˆ†)。CC引数ã¯ï½¤åˆ†ã®å€æ•°(15ã¨æŒ‡å®šã™ã‚Œã°ï½¤15分å˜ä½ã«å‰ã«é€²ã‚€) 6.7.4.1 (2017/02/17) 704 * ï½¥ES :指定ã®æ¬¡ã®ç§’ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡CC引数ã¯ï½¤ç§’ã®å€æ•°(15ã¨æŒ‡å®šã™ã‚Œã°ï½¤15秒å˜ä½ã«å‰ã«é€²ã‚€) 6.7.4.1 (2017/02/17) 705 * ï½¥M1 ~ MXXX :月を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡M1ãªã‚‰ç¿Œæœˆï½¤M6 ãªã‚‰åŠå¹´å¾Œ 706 * ï½¥D1 ~ DXXX :日を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡D1ãªã‚‰ç¿Œæ—¥ï½¤D200 ãªã‚‰200日後 707 * ï½¥H1 ~ HXXX :時を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡H1ãªã‚‰ï¼‘時間後、H24 ãªã‚‰ï¼’4時間後(5.5.5.6 (2012/08/31) è¿½åŠ ) 708 * ï½¥MI :分を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡ç¬¬å››å¼•æ•°(intC) ã§ï½¤æ™‚間を指定ã—ã¾ã™ï½¡(6.8.4.1 (2017/12/18) è¿½åŠ ) 709 * ï½¥YMD :CC 引数ã®YMD表記ã®æ—¥ä»˜ã‚’åŠ æ¸›ç®—ã—ã¾ã™ï½¡6.8.4.1 (2017/12/18) è¿½åŠ 710 * ï½¥HM :CC 引数ã®HM表記ã®æ™‚åˆ»ã‚’åŠ æ¸›ç®—ã—ã¾ã™ï½¡6.8.4.1 (2017/12/18) è¿½åŠ 711 * ï½¥NO :AA 引数ãŒnullã®å ´åˆï½¤ç¾åœ¨æ™‚刻ã§ã¯ãªã空文å—列ã«ã—ã¾ã™ï½¡ 7.0.1.3 (2018/11/12) è¿½åŠ 712 * ï½¥(有閑)BSD :先月ã®æœ€åˆã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(先月1日)(5.5.5.2 è¿½åŠ )。SD-1 ã¨åŒç‰ 713 * ï½¥(有閑)BED :先月ã®æœ€å¾Œã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(先月月末)(5.5.5.2 è¿½åŠ )。ED-1 ã¨åŒç‰ 714 * ï½¥(有閑)ASD :翌月ã®æœ€åˆã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(翌月1日)(5.5.5.2 è¿½åŠ )。SD1 ã¨åŒç‰ 715 * ï½¥(有閑)AED :翌月ã®æœ€å¾Œã®æ—¥ä»˜ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡(翌月月末)(5.5.5.2 è¿½åŠ )。ED1 ã¨åŒç‰ 716 * ・数å—:日を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡D1 ~ DXXX ã®ç°¡ç•¥ç³» 717 * 718 * CC 引数ã¯ï½¤ç‰¹åˆ¥ãªå‡¦ç†ã§ï½¤BB 引数ã«å¯¾ã—ã¦ï½¤åŠ 算、減算ã®ãŸã‚ã®æ•°å—を指定ã§ãã¾ã™ï½¡(5.7.4.1 (2014/03/14) è¿½åŠ ) 719 * HXXX,DXXX,MXXX å½¢å¼ã«ï½¤CC 引数を付ã‘ãŸå ´åˆã¯ï½¤XXX ã«ã•ã‚‰ã«åŠ ç®—ã•ã‚Œã¾ã™ï½¡ 720 * prmB ã«ï½¤æ•°å—を使用ã—ãŸå ´åˆï½¤(コï¾ï¾ï¾„゙ã§ãªã„å ´åˆ)ã«ã‚‚、CC 引数ã¯ï½¤åŠ ç®—ã•ã‚Œã¾ã™ï½¡ 721 * 6.8.4.1 (2017/12/18) BB 引数ã«ï½¤HM を指定ã—ãŸå ´åˆï½¤æ™‚分ã®ï¾ƒï¾žï½°ï¾€ã‚’åŠ ç®—ã—ã¾ã™ï½¡ã“ã®å ´åˆï½¤æ™‚ã«é–¢ã—ã¦ã¯ï½¤24時間を越ãˆã‚‹ 722 * å ´åˆã¯ï½¤æ—¥ä»˜ã«åŠ ç®—ã•ã‚Œã¾ã™ï½¡ä¾‹ãˆã°ï½¤ç¿Œæœã®ï¼–時を指定ã™ã‚‹å ´åˆï½¤3000 ã¨æŒ‡å®šã™ã‚‹ã“ã¨ã§ï½¤ï¼‘日+0600 ã¨ãªã‚Šã¾ã™ï½¡ 723 * 724 * @og.rev 5.6.1.1 (2013/02/08) getDateFormat( String ,String ,String ) ã‹ã‚‰åˆ†é›¢ï½¡ 725 * @og.rev 5.7.4.1 (2014/03/14) H1 ~ HXXX :時を指定ã®åˆ†ã ã‘進ã‚る処ç†ãŒå®Ÿè£…ã•ã‚Œã¦ã„ãªã‹ã£ãŸï½¡ 726 * @og.rev 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 727 * @og.rev 6.7.4.1 (2017/02/17) SH,SM,SS,EH,EM,ES è¿½åŠ 728 * @og.rev 6.8.4.1 (2017/12/18) YMD , HM , MI è¿½åŠ 729 * @og.rev 6.9.2.1 (2018/03/12) 年関連ã®æ©Ÿèƒ½(Y4,SY,EY)è¿½åŠ 730 * @og.rev 7.0.1.3 (2018/11/12) BB 引数㫠NOè¿½åŠ 731 * 732 * @param now 基準ã¨ãªã‚‹æ—¥ä»˜ï¼ˆCalendarオブジェクト) 733 * @param prmB 処ç†ï½ºï¾ï¾ï¾„゙ 734 * @param intC åŠ æ¸›ç®—å‡¦ç†ã‚’è¡Œã†ãŸã‚ã®æ•°å—。0 ã¯ï½¤BB引数ã®å¾“æ¥è¨ˆç®—ã®ã¾ã¾ï½¡ 735 */ 736 public static void calendarCalc( final Calendar now , final String prmB , final int intC ) { 737 738 // 基準ã¯ï½¤intC == 0 ã®å ´åˆ 739 if( prmB != null && prmB.length() > 0 ) { // 6.9.2.1 (2018/03/12) 年関連ã®æ©Ÿèƒ½(Y4,SY,EY)è¿½åŠ 740 if( "SY".equals( prmB ) ) { // (当年1月1日) 741 if( intC != 0 ) { now.add( Calendar.YEAR,intC ); } 742 now.set( Calendar.DAY_OF_YEAR,1 ); // ç¾åœ¨ã®å¹´ã®ä½•æ—¥ç›®ã‹ã§æŒ‡å®šã—ã¾ã™ï½¡ 743 } 744 else if( "EY".equals( prmB ) ) { // (当年年末) 745 if( intC != 0 ) { now.add( Calendar.YEAR,intC ); } 746 now.set( Calendar.MONTH,11 ); // 月ã¯ï½¤0~11 ã®å€¤ã§æŒ‡å®šï½¡ 747 now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) ); 748 } 749 else if( "SD".equals( prmB ) ) { // (当月1日) 750 if( intC != 0 ) { now.add( Calendar.MONTH,intC ); } // 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 751 now.set( Calendar.DATE,1 ); 752 } 753 else if( "ED".equals( prmB ) ) { // (当月月末) 754 if( intC != 0 ) { now.add( Calendar.MONTH,intC ); } // 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 755 now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) ); 756 } 757 else if( "SH".equals( prmB ) ) { // (時戻ã—) 6.7.4.1 (2017/02/17) SH,SM,SS,EH,EM,ES è¿½åŠ 758 // 6.9.8.0 (2018/05/28) FindBugs:æ•´æ•°ã®é™¤ç®—ã®çµæžœã‚’ double ã¾ãŸã¯ float ã«ï½·ï½¬ï½½ï¾„ã—ã¦ã„ã‚‹ 759// final int hh = intC == 0 ? 0 : (int)Math.floor( now.get( Calendar.HOUR_OF_DAY ) / intC ) * intC ; // 切æ¨ã¦ 760 final int hh = intC == 0 ? 0 : ( now.get( Calendar.HOUR_OF_DAY ) / intC ) * intC ; // 切æ¨ã¦ 761 now.set( Calendar.HOUR_OF_DAY,hh ); 762 now.set( Calendar.MINUTE ,0 ); 763 now.set( Calendar.SECOND ,0 ); 764 now.set( Calendar.MILLISECOND,0 ); 765 } 766 else if( "SM".equals( prmB ) ) { // (分戻ã—) 6.7.4.1 (2017/02/17) SH,SM,SS,EH,EM,ES è¿½åŠ 767 // 6.9.8.0 (2018/05/28) FindBugs:æ•´æ•°ã®é™¤ç®—ã®çµæžœã‚’ double ã¾ãŸã¯ float ã«ï½·ï½¬ï½½ï¾„ã—ã¦ã„ã‚‹ 768// final int mm = intC == 0 ? 0 : (int)Math.floor( now.get( Calendar.MINUTE ) / intC ) * intC ; // 切æ¨ã¦ 769 final int mm = intC == 0 ? 0 : ( now.get( Calendar.MINUTE ) / intC ) * intC ; // 切æ¨ã¦ 770 now.set( Calendar.MINUTE ,mm ); 771 now.set( Calendar.SECOND ,0 ); 772 now.set( Calendar.MILLISECOND,0 ); 773 } 774 else if( "SS".equals( prmB ) ) { // (秒戻ã—) 6.7.4.1 (2017/02/17) SH,SM,SS,EH,EM,ES è¿½åŠ 775 // 6.9.8.0 (2018/05/28) FindBugs:æ•´æ•°ã®é™¤ç®—ã®çµæžœã‚’ double ã¾ãŸã¯ float ã«ï½·ï½¬ï½½ï¾„ã—ã¦ã„ã‚‹ 776// final int ss = intC == 0 ? 0 : (int)Math.floor( now.get( Calendar.SECOND ) / intC ) * intC ; // 切æ¨ã¦ 777 final int ss = intC == 0 ? 0 : ( now.get( Calendar.SECOND ) / intC ) * intC ; // 切æ¨ã¦ 778 now.set( Calendar.SECOND ,ss ); 779 now.set( Calendar.MILLISECOND,0 ); 780 } 781 else if( "EH".equals( prmB ) ) { // (時進ã‚) 6.7.4.1 (2017/02/17) SH,SM,SS,EH,EM,ES è¿½åŠ 782 final int hh = intC == 0 ? 0 : (int)Math.ceil( (double)now.get( Calendar.HOUR_OF_DAY ) / intC ) * intC ; // 切り上㒠783 if( hh == 0 || hh >= 24 ) { 784 now.add( Calendar.DATE ,1 ); // æ—¥ã‚’åŠ ç®— 785 now.set( Calendar.HOUR_OF_DAY,0 ); 786 } 787 else { 788 now.set( Calendar.HOUR_OF_DAY,hh ); 789 } 790 now.set( Calendar.MINUTE ,0 ); 791 now.set( Calendar.SECOND ,0 ); 792 now.set( Calendar.MILLISECOND,0 ); 793 } 794 else if( "EM".equals( prmB ) ) { // (分進ã‚) 6.7.4.1 (2017/02/17) SH,SM,SS,EH,EM,ES è¿½åŠ 795 final int mm = intC == 0 ? 0 : (int)Math.ceil( (double)now.get( Calendar.MINUTE ) / intC ) * intC ; // 切切り上㒠796 if( mm == 0 || mm >= 60 ) { 797 now.add( Calendar.HOUR_OF_DAY,1 ); // æ™‚ã‚’åŠ ç®— 798 now.set( Calendar.MINUTE ,0 ); 799 } 800 else { 801 now.set( Calendar.MINUTE,mm ); 802 } 803 now.set( Calendar.SECOND ,0 ); 804 now.set( Calendar.MILLISECOND,0 ); 805 } 806 else if( "ES".equals( prmB ) ) { // (秒進ã‚) 6.7.4.1 (2017/02/17) SH,SM,SS,EH,EM,ES è¿½åŠ 807 final int ss = intC == 0 ? 0 : (int)Math.ceil( (double)now.get( Calendar.SECOND ) / intC ) * intC ; // 切り上㒠808 if( ss == 0 || ss >= 60 ) { 809 now.add( Calendar.MINUTE ,1 ); // åˆ†ã‚’åŠ ç®— 810 now.set( Calendar.SECOND ,0 ); 811 } 812 else { 813 now.set( Calendar.SECOND,ss ); 814 } 815 now.set( Calendar.MILLISECOND,0 ); 816 } 817 else if( "BSD".equals( prmB ) ) { // (先月1日) 818 // 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 819 now.add( Calendar.MONTH,intC-1 ); now.set( Calendar.DATE,1 ); 820 } 821 else if( "BED".equals( prmB ) ) { // (先月月末) 822 // 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 823 now.add( Calendar.MONTH,intC-1 ); now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) ); 824 } 825 else if( "ASD".equals( prmB ) ) { // (翌月1日) 826 // 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 827 now.add( Calendar.MONTH,intC+1 ); now.set( Calendar.DATE,1 ); 828 } 829 else if( "AED".equals( prmB ) ) { // (翌月月末) 830 // 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 831 now.add( Calendar.MONTH,intC+1 ); now.set( Calendar.DATE,now.getActualMaximum( Calendar.DATE ) ); 832 } 833 else if( "SW".equals( prmB ) ) { // 週åˆã‚(月曜日)セット 834 // 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 835 if( intC != 0 ) { now.add( Calendar.DATE,intC*7 ); } // ã¾ãšï½¤åŸºæº–ã®æ—¥ä»˜ã‚’週å˜ä½ã§åŠ 減算ã™ã‚‹ï½¡ 836 837 // 日付型文å—列入力データã®é–‹å§‹æ—¥ã‚’月曜日ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡ 838 // SUNDAY=1 , MONDAY=2 ã«ãªã‚Šã¾ã™ï½¡æœˆæ›œæ—¥ã¨ã®å·®ã ã‘、å‰ã«æˆ»ã—ã¾ã™ï½¡ 839 // 指定日ãŒæ—¥æ›œæ—¥ã®å ´åˆã¯ï½¤æœˆæ›œæ—¥ã¾ã§æˆ»ã—ã¾ã™ï½¡ 840 841 final int shu = now.get( Calendar.DAY_OF_WEEK ) - Calendar.MONDAY ; 842 843 if( shu > 0 ) { now.add( Calendar.DATE, -shu ); } 844 else if( shu < 0 ) { now.add( Calendar.DATE, -6 ); } 845 } 846 else if( "EW".equals( prmB ) ) { // 週末(日曜日)ã«ï½¾ï½¯ï¾„ 847 // 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 848 if( intC != 0 ) { now.add( Calendar.DATE,intC*7 ); } // ã¾ãšï½¤åŸºæº–ã®æ—¥ä»˜ã‚’週å˜ä½ã§åŠ 減算ã™ã‚‹ï½¡ 849 850 // 日付型文å—列入力データã®çµ‚了日を日曜日ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡ 851 // SUNDAY=1 , MONDAY=2 ã«ãªã‚Šã¾ã™ï½¡æ—¥æ›œæ—¥ã«ãªã‚‹ã‚ˆã†ã«ï½¤å…ˆã«é€²ã‚ã¾ã™ï½¡ 852 final int shu = now.get( Calendar.DAY_OF_WEEK ) ; 853 if( shu != Calendar.SUNDAY ) { now.add( Calendar.DATE, 8-shu ); } 854 } 855 // 6.8.4.1 (2017/12/18) YMD è¿½åŠ (年月日ã®ç¹°ã‚Šä¸Šã’è¡¨è¨˜ã‚’åŠ å‘³ã—ãŸåŠ ç®—) 856 else if( "YMD".equals( prmB ) ) { 857 final int year = intC / 10_000; // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseUnderscoresInNumericLiterals 858 final int month = ( intC / 100 ) % 100; 859 final int date = intC % 100; 860 861 now.add( Calendar.YEAR , year ); 862 now.add( Calendar.MONTH , month ); 863 now.add( Calendar.DATE , date ); 864 } 865 // 6.8.4.1 (2017/12/18) HM è¿½åŠ (時分ã®ï¼’ï¼”æ™‚é–“è¡¨è¨˜ã‚’åŠ å‘³ã—ãŸåŠ ç®—) 866 else if( "HM".equals( prmB ) ) { // 注æ„:prmB.charAt(0) == 'H' より先ã«åˆ¤å®šã—ã¦ãŠãã¾ã™ï½¡ 867 final int hour = intC / 100; 868 final int minute = intC % 100; 869 870 now.add( Calendar.HOUR_OF_DAY , hour ); 871 now.add( Calendar.MINUTE , minute ); 872 } 873 // 6.8.4.1 (2017/12/18) HM 分を指定ã®åˆ†ã ã‘進ã‚ã¾ã™ï½¡ 874 else if( "MI".equals( prmB ) ) { // 注æ„:prmB.charAt(0) == 'M' より先ã«åˆ¤å®šã—ã¦ãŠãã¾ã™ï½¡ 875 now.add( Calendar.MINUTE , intC ); 876 } 877 // 7.0.1.3 (2018/11/12) AA 引数ãŒnullã®å ´åˆï½¤ç¾åœ¨æ™‚刻ã§ã¯ãªã空文å—列ã«ã—ã¾ã™ï½¡ 878 else if( "NO".equals( prmB ) ) { 879 ; // 何もã—ã¾ã›ã‚“。 // 8.5.4.2 (2024/01/12) 空行を明示ã™ã‚‹æ–¹æ³• //NOPMD 880 } 881 // 6.9.2.1 (2018/03/12) Y1 ~ YXXX :年を指定ã®åˆ†ã ã‘進ã‚ã‚‹å‡¦ç† 882 else if( prmB.charAt(0) == 'Y' ) { 883 int year = intC ; 884 if( prmB.length() > 1 ) { year += Integer.parseInt( prmB.substring( 1 ) ); } 885 now.add( Calendar.YEAR , year ); 886 } 887 else if( prmB.charAt(0) == 'H' ) { // 6.1.0.0 (2014/12/26) refactoring 888 int hour = intC ; 889 if( prmB.length() > 1 ) { hour += Integer.parseInt( prmB.substring( 1 ) ); } 890 now.add( Calendar.HOUR_OF_DAY , hour ); 891 } 892 else if( prmB.charAt(0) == 'D' ) { // 6.1.0.0 (2014/12/26) refactoring 893 int day = intC ; 894 if( prmB.length() > 1 ) { day += Integer.parseInt( prmB.substring( 1 ) ); } 895 now.add( Calendar.DATE, day ); 896 } 897 else if( prmB.charAt(0) == 'M' ) { // 6.1.0.0 (2014/12/26) refactoring 898 int month = intC ; 899 if( prmB.length() > 1 ) { month += Integer.parseInt( prmB.substring( 1 ) ); } 900 now.add( Calendar.MONTH , month ); 901 } 902 else { 903 // 上記ã®ï¾Šï¾Ÿï¾€ï½°ï¾ä»¥å¤–ã¯ï½¤æ•°å—ï¼ˆåŠ æ¸›ç®—ã™ã‚‹æ—¥æ•°ï¼‰ãªã®ã§ï½¤å¤‰æ›ã§ããªã‘ã‚Œã°ï½¤ï¾Œï½«ï½°ï¾ï½¯ï¾„ï½´ï¾—ï½° 904 try { 905 final int day = Integer.parseInt( prmB ) + intC ; // 5.7.4.1 (2014/03/14) CC å¼•æ•°è¿½åŠ 906 now.add( Calendar.DATE, day ); 907 } 908 catch( final NumberFormatException ex ) { 909 final String errMsg = "日付変数パラメータã«ï½¤ä¸æ£ãªå€¤ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸï½¡ä»¥ä¸‹ã®ä¸ã‹ã‚‰æŒ‡å®šã—ãªãŠã—ã¦ãã ã•ã„。" 910// + "指定å¯èƒ½ï¼š[SD,ED,SW,SH,SM,SS,EW,EH,EM,ES,H1~HXXX,D1~DXXX,M1~MXXX,HMS,BSD,BED,ASD,AED]" 911 + "指定å¯èƒ½ï¼š[SY,SD,SW,SH,SM,SS,EY,ED,EW,EH,EM,ES,M1~MXXX,D1~DXXX,H1~HXXX,MI,YMD,HM,NO]" 912 + " prmB=[" + prmB + "]" ; 913 throw new OgRuntimeException( errMsg,ex ); 914 } 915 } 916 } 917 } 918 919 /** 920 * 日付ã®å·®åˆ†ã‚’求ã‚ã¾ã™ï½¡ 921 * timeA - timeB を求ã‚、intCã®æ•°å€¤ã§å˜ä½ã‚’指定ã—ã¾ã™ï½¡ 922 * 923 * intC ã¯ï½¤1:å¹´ 2:月 3:æ—¥ 4:時 5:分 6:秒 ã«æ›ç®—ã—ãŸå˜ä½ã§ã®å·®åˆ†ã«ãªã‚Šã¾ã™ï½¡ 924 * 端数ã¯å‡ºã¾ã›ã‚“。 925 * 926 * @og.rev 7.0.1.1 (2018/10/22) DATE.DIFF è¿½åŠ 927 * @og.rev 7.2.9.4 (2020/11/20) spotbugs:switch æ–‡ã®2ã¤ã® case ã®ãŸã‚ã«åŒã˜ï½ºï½°ï¾„゙を使用ã—ã¦ã„るメソッド 928 * @og.rev 8.5.5.1 (2024/02/29) switchå¼ã®ä½¿ç”¨ 929 * 930 * @param timeA 基準ã¨ãªã‚‹æ—¥ä»˜ï¼ˆCalendarオブジェクト) 931 * @param prmB 日付データã«ãªã‚Šã¾ã™ï½¡AA-BB ã®é–¢ä¿‚ã§ã™ï½¡ 932 * @param intC 差分ã®å˜ä½ã‚’指定ã™ã‚‹ï½·ï½°ï¾œï½°ï¾„゙(1:å¹´ 2:月 3:æ—¥ 4:時 5:分 6:秒 ã«æ›ç®—) 933 * @return 指定ã®æ™‚é–“ã®å·®(timeA - timeB ï¾ï½²ï¾…スもã‚ã‚‹) 934 */ 935 public static String calendarDiff( final Calendar timeA , final String prmB , final int intC ) { 936 final Calendar timeB = getCalendar( prmB ); 937 938 final int diff ; 939 if( intC == 1 ) { // 差分年 940 diff = timeA.get( Calendar.YEAR ) - timeB.get( Calendar.YEAR ); 941 } 942 else if( intC == 2 ) { // 差分月数 943 diff = ( timeA.get( Calendar.YEAR ) - timeB.get( Calendar.YEAR ) ) * 12 944 + ( timeA.get( Calendar.MONTH ) - timeB.get( Calendar.MONTH ) ) ; 945 946 // // 月ã®è¨ˆç®—ロジック( http://javatechnology.net/java/date-diff-month/ ) 947 // // ï¾ï½²ï¾…ス計算も必è¦ãªã®ã§ï½¤ä»Šå›žã¯ä¸æŽ¡ç”¨ 948 // timeA.set( Calendar.DATE, 1 ); // 端数を無視ã™ã‚‹ãŸã‚、1æ—¥ã«ï½¾ï½¯ï¾„ã—ã¾ã™ï½¡ 949 // timeB.set( Calendar.DATE, 1 ); // åŒä¸Š 950 951 // int count = 0; 952 // while( timeA.before( timeB ) ) { 953 // timeA.add( Calendar.MONTH, 1 ); 954 // count++; 955 // } 956 // diff = count; 957 } 958 else { 959 final long diffSec = timeA.getTimeInMillis() - timeB.getTimeInMillis() ; // 時間ã®å·®(ï¾ï¾˜ç§’) 960 961 // 8.5.5.1 (2024/02/29) switchå¼ã®ä½¿ç”¨ 962// switch( intC ) { 963// // case 3: diff = (int)( diffSec / DD ); break; // æ—¥å˜ä½ // 7.2.9.4 (2020/11/20) 964// case 4: diff = (int)( diffSec / HH ); break; // 時å˜ä½ 965// case 5: diff = (int)( diffSec / MM ); break; // 分å˜ä½ 966// case 6: diff = (int)( diffSec / SS ); break; // 秒å˜ä½ 967// default: diff = (int)( diffSec / DD ); break; // (åˆæœŸå€¤)æ—¥å˜ä½ 968// } 969 diff = switch( intC ) { 970 // case 3 -> (int)( diffSec / DD ); // æ—¥å˜ä½ // 7.2.9.4 (2020/11/20) 971 case 4 -> (int)( diffSec / HH ); // 時å˜ä½ 972 case 5 -> (int)( diffSec / MM ); // 分å˜ä½ 973 case 6 -> (int)( diffSec / SS ); // 秒å˜ä½ 974 default -> (int)( diffSec / DD ); // (åˆæœŸå€¤)æ—¥å˜ä½ 975 }; 976 } 977 978 return Integer.toString( diff ) ; 979 } 980 981 /** 982 * 指定ã®å¼•æ•°ã®æ—¥ä»˜ã‘æ–‡å—列より、カレï¾ï¾€ï¾žï½µï¾Œï¾žï½¼ï¾žï½ªï½¸ï¾„を作æˆã—ã¾ã™ï½¡ 983 * 引数ã¯ï½¤æ•°å—以外ã®æ–‡å—を削除ã—ãŸçŠ¶æ…‹ã«å¤‰æ›å¾Œï½¤å‡¦ç†ã«å›žã—ã¾ã™ï½¡ 984 * ä¸è¦ãªæ–‡å—を削除ã—ãŸçŠ¶æ…‹ã§ï½¤ï¼˜æ–‡å—以上ã«ãªã‚‹ã‚ˆã†ã«æŒ‡å®šã—ã¦ãã ã•ã„。 985 * 例外的ã«ï½¤ï¼–æ–‡å—ã®å ´åˆã¯ï½¤yyyyMM01 ã¨ã¿ãªã—ã¦ï½¤"01" æ–‡å—列を付与ã—ã¾ã™ï½¡ 986 * 引数㫠null を指定ã™ã‚‹ã¨ï½¤ç¾åœ¨æ™‚刻ã®ï½¶ï¾šï¾ï¾€ï¾žã‚’è¿”ã—ã¾ã™ï½¡ 987 * ãれ以外ã®ï¾ƒï¾žï½°ï¾€ã§ï½¤ï¼˜ï½¹ï¾€ä»¥ä¸‹ã®å ´åˆã¯ï½¤RuntimeException ãŒç™ºç”Ÿã—ã¾ã™ï½¡ 988 * 8ケタ以上14ケタ未満ã®å ´åˆã¯ï½¤ï¼˜ï½¹ï¾€åˆ†ã‚’、年月日ã«åˆ†é›¢ã—ãŸï½¶ï¾šï¾ï¾€ï¾ž 989 * オブジェクトを作æˆã—ã¾ã™ï½¡ï¼‘4ケタ以上ã§åˆã‚ã¦ï½¤æ™‚分秒をå«ã‚€ï½¶ï¾šï¾ï¾€ï¾ž 990 * を作æˆã—ã¾ã™ï½¡ 991 * 992 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæˆ 993 * @og.rev 5.5.8.2 (2012/11/09) value ã®åˆ¤å®šã«ï½¤null 㨠ゼロ文å—列を判定ã™ã‚‹ï½¡ 994 * 995 * @param value 日付ã‘æ–‡å—列 996 * 997 * @return カレï¾ï¾€ï¾žï½µï¾Œï¾žï½¼ï¾žï½ªï½¸ï¾„(引数ãŒnullã®å ´åˆã¯ï½¤ç¾åœ¨æ™‚刻) 998 * @og.rtnNotNull 999 */ 1000 public static Calendar getCalendar( final String value ) { 1001 final Calendar cal = Calendar.getInstance(); 1002 1003 if( value == null || value.isEmpty() ) { return cal; } // 5.5.8.2 (2012/11/09) null 㨠ゼロ文å—列を判定ã™ã‚‹ï½¡ 1004 1005 // 日付表記ã«ä¸è¦ãªæ–‡å—を削除ã—ã¾ã™ï½¡ 1006 String dateStr = parseNumber( value ) ; 1007 1008 if( dateStr.length() == 6 ) { dateStr = dateStr + "01"; } // yyyyMM01 å½¢å¼ã«ç„¡ç†ã‚„ã‚Šåˆã‚ã›ã‚‹ï½¡ 1009 else if( dateStr.length() < 8 ) { 1010 final String errMsg = "日付指定パラメータã«ï½¤ä¸æ£ãªå€¤ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸï½¡value=[" + value + "]" ; 1011 throw new OgRuntimeException( errMsg ); 1012 } 1013 1014 cal.clear(); // 日付文å—列ãŒå˜åœ¨ã™ã‚‹ã®ã§ï½¤ï½¶ï¾šï¾ï¾€ï¾žã‚’リセット 1015 1016 final int year = Integer.parseInt( dateStr.substring( 0,4 ) ); 1017 final int month = Integer.parseInt( dateStr.substring( 4,6 ) ) - 1; 1018 final int date = Integer.parseInt( dateStr.substring( 6,8 ) ); 1019 1020 // 6.3.9.0 (2015/11/06) Use one line for each declaration, it enhances code readability.(PMD) 1021 int hour =0; 1022 int minute=0; 1023 int second=0; 1024 if( dateStr.length() >= 14 ) { 1025 hour = Integer.parseInt( dateStr.substring( 8,10 ) ); 1026 minute = Integer.parseInt( dateStr.substring( 10,12 ) ); 1027 second = Integer.parseInt( dateStr.substring( 12,14 ) ); 1028 } 1029 1030 cal.set( year,month,date,hour,minute,second ); 1031 1032 return cal; 1033 } 1034 1035 /** 1036 * 指定ã®å¼•æ•°ã®æ—¥ä»˜ã‘æ–‡å—列(yyyyMMdd)ã‚ˆã‚Šï½¤æ—¥ä»˜ã‚’åŠ ç®—ã—ã¦è¿”ã—ã¾ã™ï½¡ 1037 * ï¾ï½²ï¾…スを与ãˆã‚‹ã¨ï½¤æ¸›ç®—ã—ã¾ã™ï½¡ 1038 * 日付以上ã®ç²¾åº¦ã®æ–‡å—列を渡ã—ã¦ã‚‚、日付ã®ã¿ã®è¨ˆç®—ã¨ãªã‚Šã¾ã™ï½¡ 1039 * çµæžœã¯ï½¤å¼•æ•°ã®æ—¥ä»˜ï¾Œï½«ï½°ï¾ï½¯ï¾„ã¨ã¯å…¨ã別ã§ï½¤yyyyMMdd ã®ï¼˜æ–‡å—å½¢å¼ã«ãªã‚Šã¾ã™ï½¡ 1040 * 引数㫠null を渡ã™ã¨ï½¤å®Ÿè¡Œæ™‚ã®æ—¥ä»˜ã‚’ï¾ï¾žï½°ï½½ã¨ã—ã¦å‡¦ç†ã—ã¾ã™ï½¡ 1041 * 1042 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæˆ 1043 * 1044 * @param baseDate 日付ã‘æ–‡å—列(yyyyMMdd) 1045 * @param plus åŠ ç®—ã™ã‚‹æ—¥æ•°(éŽåŽ»ã«ã™ã‚‹ã«ã¯ï¾ï½²ï¾…ス値を指定ã™ã‚‹) 1046 * 1047 * @return çµæžœã®æ—¥ä»˜(yyyyMMdd) 1048 * @og.rtnNotNull 1049 */ 1050 public static String getDatePlus( final String baseDate,final int plus ) { 1051 final Calendar cal = getCalendar( baseDate ); 1052 cal.add( Calendar.DATE,plus ); 1053 1054 return DateSet.getDate( cal.getTimeInMillis() , "yyyyMMdd" ); 1055 } 1056 1057 /** 1058 * ç¾åœ¨ã®æœˆã«ï½¤æŒ‡å®šã®æœˆæ•°ã‚’プラスã—ãŸæ—¥ä»˜æ–‡å—列を返ã—ã¾ã™ï½¡ 1059 * 日付文å—列ã®ï¾Œï½«ï½°ï¾ï½¯ï¾„ã¯ï½¤"yyyyMM" ã§ã™ï½¡ 1060 * 指定ã™ã‚‹æœˆæ•°ã«ï¾ï½²ï¾…スを指定ã™ã‚‹ã¨ï½¤æ¸›ç®—ã§ãã¾ã™ï½¡ 1061 * 1062 * @og.rev 5.5.7.2 (2012/10/09) æ–°è¦ä½œæˆ 1063 * 1064 * @param baseDate 日付ã‘æ–‡å—列(yyyyMM) 1065 * @param plus åŠ ç®—ã™ã‚‹æœˆæ•°(éŽåŽ»ã«ã™ã‚‹ã«ã¯ï¾ï½²ï¾…ス値を指定ã™ã‚‹) 1066 * 1067 * @return 指定ã®æœˆæ•°ã‚’プラスã—ãŸæ—¥ä»˜æ–‡å—列(yyyyMM) 1068 * @og.rtnNotNull 1069 */ 1070 public static String getMonthPlus( final String baseDate,final int plus ) { 1071 final Calendar cal = getCalendar( baseDate ); 1072 cal.set( Calendar.DATE, 1 ); // 当月㮠1 æ—¥ã«è¨å®š 1073 cal.add( Calendar.MONTH , plus ); 1074 1075 return DateSet.getDate( cal.getTimeInMillis() , "yyyyMM" ); 1076 } 1077 1078 /** 1079 * 指定ã®å¼•æ•°ã®æ—¥ä»˜ã‘æ–‡å—列(yyyyMMdd、yyyyMMddHHmmss)ã«ï½¤æ—¥ä»˜ã‚’åŠ ç®—ã—ã¦è¿”ã—ã¾ã™ï½¡ 1080 * ï¾ï½²ï¾…スを与ãˆã‚‹ã¨ï½¤æ¸›ç®—ã—ã¾ã™ï½¡ 1081 * 1082 * 指定ã™ã‚‹æ—¥ä»˜ã«ã¯ï½¤å˜ä½ã‚’付与ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ï½¡ 1083 * å˜ä½ã¯ï½¤yyyyMMddHHmmss å½¢å¼ã®ï¼‘æ–‡å—を指定ã—ã¾ã™ï½¡å¤§æ–‡å—、å°æ–‡å—ã‚‚è˜åˆ¥ã—ã¾ã™ï½¡ 1084 * plus="5M" ã¨ã™ã‚Œã°ï½¤ï¼•ã‹æœˆï½¤plus="5d" ã¨ã™ã‚Œã°ï½¤ï¼•æ—¥ è¿½åŠ ã—ã¾ã™ï½¡ 1085 * plus ã«å˜ä½ã‚’付ã‘ãªã„å ´åˆã¯ï½¤tani ã«æŒ‡å®šã®å˜ä½ã‚’使ã„ã¾ã™ï½¡ 1086 * plus ãã®ã‚‚ã®ãŒï½¤null ã‹ï½¤isEmpty ã®å ´åˆã¯ï½¤åŠ ç®—ã¯ï½¤1 ã«ãªã‚Šã¾ã™ï½¡ 1087 * 1088 * baseDate æ–‡å—列を日付文å—列ã«å¤‰æ›å¾Œï½¤Calendar ã§è¨ˆç®—ã—、çµæžœã‚’、format å½¢å¼ã«å¤‰æ›ã—ã¾ã™ï½¡ 1089 * 引数㫠null を渡ã™ã¨ï½¤å®Ÿè¡Œæ™‚ã®æ—¥ä»˜ã‚’ï¾ï¾žï½°ï½½ã¨ã—ã¦å‡¦ç†ã—ã¾ã™ï½¡ 1090 * 1091 * @og.rev 5.6.1.0 (2013/02/01) æ–°è¦ä½œæˆ 1092 * @og.rev 8.5.5.1 (2024/02/29) switchå¼ã®ä½¿ç”¨ 1093 * 1094 * @param baseDate 日付ã‘æ–‡å—列(yyyyMMdd、yyyyMMddHHmmss å½¢å¼ã®æ—¥ä»˜æ–‡å—列) 1095 * @param plus åŠ ç®—ã™ã‚‹æ—¥æ•°(日付å˜ä½ã‚’å«ã‚€ï½¡å˜ä½ã¯ï½¤y,M,d,H,m,s ã®æ–‡å—ã§ï½¤å¤§æ–‡å—å°æ–‡å—ã®åŒºåˆ¥ãŒã‚ã‚Šã¾ã™) 1096 * @param defTani 日付å˜ä½ãŒæœªæŒ‡å®šã®å ´åˆã®åˆæœŸå˜ä½('y','M','d','H','m','s' ã®ã©ã‚Œã‹) 1097 * @param format è¿”ã™æ—¥ä»˜æ–‡å—列ã®ï¾Œï½«ï½°ï¾ï½¯ï¾„(yyyyMMdd、yyyyMMddHHmmss) 1098 * 1099 * @return çµæžœã®æ—¥ä»˜(yyyyMMdd) 1100 * @throws NumberFormatException åŠ ç®—ã™ã‚‹æ—¥æ•°ã®å˜ä½ãŒ('y','M','d','H','m','s')以外ã®å ´åˆï½¡ 1101 * @og.rtnNotNull 1102 */ 1103 public static String getDatePlus( final String baseDate,final String plus,final int defTani,final String format ) { 1104 1105 int addSu = 1; // åˆæœŸå€¤(plus ㌠null ã‚„ Empty ã®å ´åˆã¯ï½¤ï¼‹ï¼‘ã¨ãªã‚‹) 1106 int tani = defTani; 1107 1108 if( plus != null && !plus.isEmpty() ) { 1109 boolean flag = true; // 日付å˜ä½ã‚’æŒã£ã¦ã„ã‚‹ã‹ã©ã†ã‹ï½¡æŒã£ã¦ã„ã‚‹å ´åˆã¯ï½¤true 1110 final char ch = plus.charAt( plus.length()-1 ); // 最後ã®ä¸€æ–‡å—ã‚’å–å¾—(å˜ä½ã‹ï½¤æ•°å—本体) 1111 // 8.5.5.1 (2024/02/29) switchå¼ã®ä½¿ç”¨ 1112// switch( ch ) { 1113// case 'y' : tani = Calendar.YEAR; break ; 1114// case 'M' : tani = Calendar.MONTH; break ; 1115// case 'd' : tani = Calendar.DATE; break ; 1116// case 'H' : tani = Calendar.HOUR_OF_DAY; break ; 1117// case 'm' : tani = Calendar.MINUTE; break ; 1118// case 's' : tani = Calendar.SECOND; break ; 1119// default : flag = false; break ; // 日付å˜ä½ã‚’æŒã£ã¦ã„ãªã„。 1120// } 1121 tani = switch( ch ) { 1122 case 'y' -> Calendar.YEAR; 1123 case 'M' -> Calendar.MONTH; 1124 case 'd' -> Calendar.DATE; 1125 case 'H' -> Calendar.HOUR_OF_DAY; 1126 case 'm' -> Calendar.MINUTE; 1127 case 's' -> Calendar.SECOND; 1128 default -> { flag = false; yield tani; } // 日付å˜ä½ã‚’æŒã£ã¦ã„ãªã„。 1129 }; 1130 if( flag ) { 1131 addSu = Integer.parseInt( plus.substring( 0,plus.length()-1 ) ); // 日付å˜ä½ ã‚ã‚Š 1132 } 1133 else { 1134 addSu = Integer.parseInt( plus ) ; // 日付å˜ä½ ãªã— 1135 } 1136 } 1137 1138 final Calendar cal = getCalendar( baseDate ); 1139 cal.add( tani,addSu ); 1140 1141 return DateSet.getDate( cal.getTimeInMillis() , format ); 1142 } 1143 1144 /** 1145 * 指定ã®æ—¥ä»˜æ–‡å—列を指定ã®å½¢å¼ã®æ–‡å—列ã«å¤‰æ›ã—ã¾ã™ï½¡ 1146 * 入力ã®æ—¥ä»˜æ–‡å—列ã¯ï½¤"yyyyMMddHHmmss" ã¾ãŸã¯ï½¤ "yyyyMMdd" ã§ã™ï½¡ 1147 * 記å·ãŒå…¥ã£ã¦ã„ã‚‹å ´åˆã§ã‚‚、一応処ç†ã—ã¾ã™ï½¡ 1148 * 指定ã®ï¾Œï½«ï½°ï¾ï½¯ï¾„も、åŒæ§˜ã«ï½¤yyyyMMddHHmmss å½¢å¼ã§æŒ‡å®šã—ã¾ã™ï½¡ 1149 * 1150 * @og.rev 7.0.1.2 (2018/11/04) æ–°è¦ç™»éŒ² 1151 * 1152 * @param ymd 日付ã‘æ–‡å—列(yyyyMM) 1153 * @param format åŠ ç®—ã™ã‚‹æœˆæ•°(éŽåŽ»ã«ã™ã‚‹ã«ã¯ï¾ï½²ï¾…ス値を指定ã™ã‚‹) 1154 * 1155 * @return 指定ã®æ—¥ä»˜æ–‡å—列を指定ã®å½¢å¼ã®æ–‡å—列ã«å¤‰æ› 1156 * @og.rtnNotNull 1157 */ 1158 public static String toYmd( final String ymd,final String format ) { 1159 final Calendar cal = getCalendar( ymd ); 1160 1161 return DateSet.getDate( cal.getTimeInMillis() , format ); 1162 } 1163 1164 /** 1165 * 指定ã®å¹´æœˆæ–‡å—列ã®From-Toを、文å—列ã®é…列ã§è¿”ã—ã¾ã™ï½¡ 1166 * "yyyyMM" å½¢å¼ã®ç¯„囲内ã®æ–‡å—列é…列を作æˆã—ã¾ã™ï½¡ 1167 * 1168 * ※ endãŒnullã®å ´åˆã¯ï½¤beginãã®ã‚‚ã®ã‚’é…列ã«ï½¾ï½¯ï¾„ã—ã¦è¿”ã—ã¾ã™ï½¡ 1169 * ã¤ã¾ã‚Šï½¤1件ã®ã¿ã®é…列ã«ãªã‚Šã¾ã™ï½¡ 1170 * ※ end == beginã®å ´åˆã¯ï½¤é…列ã¯ï½¤ï½¾ï¾žï¾›å€‹ã®é…列ã«ãªã‚Šã¾ã™ï½¡ 1171 * 1172 * @og.rev 7.0.5.0 (2019/09/09) æ–°è¦è¿½åŠ 1173 * 1174 * @param begin 開始ã®å¹´æœˆ(å«ã‚€) 1175 * @param end 終了ã®å¹´æœˆ(å«ã¾ãªã„) 1176 * @param step åŠ ç®—ã™ã‚‹æœˆæ•° 1177 * 1178 * @return 指定ã®å¹´æœˆæ–‡å—列ã®From-Toを、文å—列ã®é…列ã§è¿”ã™ 1179 * @og.rtnNotNull 1180 */ 1181 public static String[] stepYM( final String begin,final String end,final int step ) { 1182 final List<String> list = new ArrayList<>(); 1183 1184 if( StringUtil.isNull( end ) ) { 1185 list.add( begin ); 1186 } 1187 else { 1188 final Calendar timeA = getCalendar( begin ); 1189 final Calendar timeB = getCalendar( end ); 1190 1191 while( timeA.before( timeB ) ) { 1192 list.add( DateSet.getDate( timeA.getTimeInMillis() , "yyyyMM" ) ); 1193 timeA.add( Calendar.MONTH, 1 ); 1194 } 1195 } 1196 1197// return list.toArray( new String[list.size()] ) ; 1198 return list.toArray( new String[0] ) ; // 8.5.4.2 (2024/01/12) PMD 7.0.0 OptimizableToArrayCall 対応 1199 } 1200}