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.io.FileInputStream; 019 import java.io.FileOutputStream; 020 021 // import java.util.Date; 022 // import java.util.Locale; 023 // import java.text.DateFormat; 024 // import java.text.SimpleDateFormat; 025 026 /** 027 * DateSet.java ã¯ã€å?åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã®æ—¥ä»˜ï¼Œæ™‚刻ã‚ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’å®Ÿè¡Œæ™‚ã®æ—¥æ™‚ã§å¤‰æ›ã—ã¦,出力ã—ã¾ã™ã? 028 * 029 * 変æ›ã«ã¯,$(yyyy)ã®å½¢å¼ã§æŒ?®šã—,ã‚«ãƒ?‚³ã®æ–?—å?ã¯,java.text.SimpleDateFormat ã§ä½¿ç”¨ã™ã‚‹?? 030 * 時刻フォーマット構文を用ã?¾ã™ã? 031 * ã¾ãŸã?引数㫠keys,vals を渡ã™ã“ã¨ã§ã€?(KEY1) æ–?—å?ã‚?VAL1 æ–?—å?ã¨ç½®ãæ›ãˆã¾ã™ã? 032 * 033 * サンプルファイル 034 * $(yyyy/MM/dd) å¹´?月?日を表ã—ã¾ã™ã? 035 * $(yy) å¹´ã?‘ã‚’ï¼’æ¡ã§è¡¨ã—ã¾ã™ã? 036 * $(MM) 月を?’æ¡?(02,03ãªã©)ã§è¡¨ã—ã¾ã™ã? 037 * $(dd) 日を2æ¡?(02,03ãªã©)ã§è¡¨ã—ã¾ã™ã? 038 * $(HH:mm:ss) 時:å??šç§’を表ã—ã¾ã™ã? 039 * $(MMMMMMMM) 月をフルスペルã§è¡¨ã—ã¾ã™ã? 040 * $(MMM) 月を?“æ¡å›ºå®?Mar?ŒAplãªã©)ã§è¡¨ã—ã¾ã™ã? 041 * $(EEEEEEEE) 曜日をフルスペルã§è¡¨ã—ã¾ã™ã? 042 * $(EEE) 曜日を3æ¡å›ºå®?Sun,Monãªã©)ã§è¡¨ã—ã¾ã™ã? 043 * 044 * 時刻フォーマット構文 045 * 046 * è¨˜å· æ„味 表示 ä¾? 047 * ------ ------- ------------ ------- 048 * G å¹´å· (ãƒ?‚スãƒ? AD 049 * y å¹´ (数値) 1996 050 * M æœ? (ãƒ?‚スãƒ?& 数値) July & 07 051 * d æ—¥ (数値) 10 052 * h åˆå‰/åˆå¾Œã?æ™?(1~12) (数値) 12 053 * H ä¸?—¥ã«ãŠã‘る時 (0~23) (数値) 0 054 * m åˆ? (数値) 30 055 * s ç§? (数値) 55 056 * S ミリç§? (数値) 978 057 * E 曜日 (ãƒ?‚スãƒ? ç«æ›œæ—¥ 058 * D å¹´ã«ãŠã‘ã‚‹æ—¥ (数値) 189 059 * F 月ã«ãŠã‘る曜日 (数値) 2 (7月ã?第2水曜日) 060 * w å¹´ã«ãŠã‘ã‚‹é? (数値) 27 061 * W 月ã«ãŠã‘ã‚‹é? (数値) 2 062 * a åˆå‰/åˆå¾? (ãƒ?‚スãƒ? PM 063 * k ä¸?—¥ã«ãŠã‘る時 (1~24) (数値) 24 064 * K åˆå‰/åˆå¾Œã?æ™?(0~11) (数値) 0 065 * z 時間帯 (ãƒ?‚スãƒ? PDT 066 * ' ãƒ?‚スト用エスケーãƒ? 067 * '' å˜ä¸?¼•用符 ' 068 * 069 * パターンæ–?—ã?カウントã«ã‚ˆã£ã¦ã€ãã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒæ±ºã¾ã‚Šã¾ã™ã? 070 * (ãƒ?‚スãƒ?: 4以ä¸? フル形å¼ã‚’使用ã—ã¾ã™ã?< 4: çŸã?¾ãŸã?çœåŠ›ã•れãŸå½¢å¼ãŒã‚れã°ã€ãれを使用ã—ã¾ã™ã? 071 * 072 * (数値): æœ?°æ¡æ•°ã€‚ã“れよりçŸã?•°å€¤ã¯ã€ã“ã®æ¡æ•°ã¾ã§ã‚¼ãƒãŒè¿½åŠ?•れã¾ã™ã?å¹´ã«ã¯ç‰¹åˆ¥ãªå‡¦ç?Œã‚りã¾ã™ã? 073 * ã¤ã¾ã‚Šã?'y'ã®ã‚«ã‚¦ãƒ³ãƒˆãŒ2ãªã‚‰ã?å¹´ã¯2æ¡ã«çŸç¸®ã•れã¾ã™ã? 074 * 075 * (ãƒ?‚スãƒ?& 数値): 3以上ãªã‚‰ãƒ†ã‚ストをã€ãれ以外ãªã‚‰æ•°å€¤ã‚’使用ã—ã¾ã™ã? 076 * 077 * ãƒ‘ã‚¿ãƒ¼ãƒ³ã®æ–?—ãŒ['a'..'z']ã¨['A'..'Z']ã®ç¯?›²ã«ãªã‘れã°ã€ãã®æ–?—ã?引用ãƒ?‚ストã¨ã—ã¦æ‰±ã‚れã¾ã™ã? 078 * ãŸã¨ãˆã?ã€?:'ã€?.'ã€? 'ã€?#'ã€?@'ãªã©ã®æ–?—ã?ã€å˜ä¸?¼•用符ã«å›²ã¾ã‚Œã¦ã?ªãã¦ã‚‚ã? 079 * çµæžœã®æ™‚刻ãƒ?‚ストã«ä½¿ç”¨ã•れã¾ã™ã? 080 * 081 * 無効ãªãƒ‘ターンæ–?—ãŒãƒ‘ターンã«å…¥ã£ã¦ã?‚‹ã¨ã€ãƒ•ォーマットや解æžã§ä¾‹å¤–ãŒã‚¹ãƒãƒ¼ã•れã¾ã™ã? 082 * 083 * USãƒã‚±ãƒ¼ãƒ«ã‚’使ã£ãŸä¾? 084 * 085 * フォーマットパターン çµæžœ 086 * -------------------- ---- 087 * "yyyy.MM.dd G 'at' hh:mm:ss z" ->> 1996.07.10 AD at 15:08:56 PDT 088 * "EEE, MMM d, ''yy" ->> Wed, July 10, '96 089 * "h:mm a" ->> 12:08 PM 090 * "hh 'o''''clock' a, zzzz" ->> 12 o'clock PM, Pacific Daylight Time 091 * "K:mm a, z" ->> 0:00 PM, PST 092 * "yyyyy.MMMMM.dd GGG hh:mm aaa" ->> 1996.July.10 AD 12:08 PM 093 * 094 * @version 0.9.0 1999/03/09 095 * @author Kazuhiko Hasegawa 096 * @since JDK1.1, 097 */ 098 public class DateSet { 099 private String[] keys = null; 100 private String[] vals = null; 101 102 /** 103 * ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆè§£æžæ™‚ã«ç½®ãæ›ãˆã‚‹ ã‚ーã¨å€¤ã®é…å?ã‚’è¨å®šã—ã¾ã™ã? 104 * 105 * $(KEY1) æ–?—å?ã‚?VAL1 æ–?—å?ã¨ç½®ãæ›ãˆã‚‹å‡¦ç?‚’行ã„ã¾ã™ã?ã“れã«ã‚ˆã‚Šæ—¥ä»˜ä»¥å¤–ã? 106 * æ–?—å?ã‚’ç½®ãæ›ãˆã‚‹å‡¦ç?‚’実行ã§ãã¾ã™ã? 107 * 108 * @param inkeys ç½®ãæ›ãˆå?ã‚ーé…å? 109 * @param invals ç½®ãæ›ãˆå?値é…å? 110 */ 111 public void setKeysVals( final String[] inkeys, final String[] invals ) { 112 if( inkeys != null && invals != null && inkeys.length == invals.length ) { 113 int size = inkeys.length ; 114 keys = new String[size]; 115 vals = new String[size]; 116 System.arraycopy( inkeys,0,keys,0,size ); 117 System.arraycopy( invals,0,vals,0,size ); 118 } 119 } 120 121 /** 122 * ç¾åœ¨æ—¥ä»˜ã?時刻をフォーマット指定å?æ‰?«åŸ‹ã‚è¾¼ã¿ã¾ã™ã? 123 * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã? 124 * 125 * @param inByte 変æ›å…?ƒã‚¤ãƒˆé?åˆ? 126 * 127 * @return 変æ›å¾Œã?ãƒã‚¤ãƒˆé?åˆ? 128 */ 129 public byte[] change( final byte[] inByte ) { 130 byte[] outByte = new byte[ inByte.length+100 ]; 131 int add = 0; 132 for( int i=0; i<inByte.length; i++) { 133 if( inByte[i] == '$' && i<inByte.length-1 && inByte[i+1] == '(' ) { 134 int j = 0; 135 while( inByte[i+j+2] != ')') { j++; } 136 // String str = changeForm( new String( inByte,i+2,j ) ); 137 // byte[] byteDate = str.getBytes() ; 138 String str = changeForm( new String( inByte,i+2,j,StringUtil.DEFAULT_CHARSET ) ); // 5.5.2.6 (2012/05/25) findbugs対å¿? 139 byte[] byteDate = str.getBytes( StringUtil.DEFAULT_CHARSET ) ; // 5.5.2.6 (2012/05/25) findbugs対å¿? 140 for( int k = 0; k<byteDate.length; k++) { 141 outByte[add] = byteDate[k]; 142 add++; 143 } 144 i += j+2; 145 } 146 else { 147 outByte[add] = inByte[i]; 148 add++; 149 } 150 } 151 byte[] rtnByte = new byte[ add ]; 152 System.arraycopy( outByte,0,rtnByte,0,add ); 153 return rtnByte; 154 } 155 156 /** 157 * keys,vals ã®å¤‰æ›ã€ãŠã‚ˆã?ã€ç¾åœ¨æ—¥ä»˜ã?時刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã? 158 * 159 * å…ˆã«ã€keys,vals ã®å¤‰æ›ã‚’行ã„ã¾ã™ã?form ãŒã?keys ã«ãƒžãƒƒãƒã™ã‚Œã?ã€vals ã‚? 160 * è¿”ã—ã¾ã™ã?æœ?¾Œã¾ã§ãƒžãƒƒãƒã—ãªã‘れã°ã€æ™‚刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã? 161 * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã? 162 * 163 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用ã™ã‚‹ã‚ˆã†ã«ä¿®æ£ã—ã¾ã™ã? 164 * 165 * @param form フォーãƒ?–‡å—å? ( ä¾?"yyyy/MM/dd HH:mm:ss" ) 166 * 167 * @return フォーマット変æ›çµæžœ 168 */ 169 public String changeForm( final String form ) { 170 if( keys != null ) { 171 for( int i=0; i<keys.length; i++ ) { 172 if( form.equals( keys[i] ) ) { 173 return vals[i]; 174 } 175 } 176 } 177 178 // DateFormat formatter = new SimpleDateFormat( form, Locale.JAPAN ); 179 // return formatter.format(new Date()); 180 181 return HybsDateUtil.getDate( form ); 182 } 183 184 /** 185 * keys,vals ã®å¤‰æ›ã€ãŠã‚ˆã?ã€ç¾åœ¨æ—¥ä»˜ã?時刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã? 186 * 187 * å…ˆã«ã€keys,vals ã®å¤‰æ›ã‚’行ã„ã¾ã™ã?form ãŒã?keys ã«ãƒžãƒƒãƒã™ã‚Œã?ã€vals ã‚? 188 * è¿”ã—ã¾ã™ã?æœ?¾Œã¾ã§ãƒžãƒƒãƒã—ãªã‘れã°ã€æ™‚刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã? 189 * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã? 190 * 191 * @param form フォーãƒ?–‡å—å? ( ä¾?"yyyy/MM/dd HH:mm:ss" ) 192 * 193 * @return フォーマット変æ›çµæžœ 194 */ 195 public String changeString( final String form ) { 196 StringBuilder buf = new StringBuilder( 200 ); 197 int bkst = 0; 198 int st = form.indexOf( "$(" ); 199 while( st >= 0 ) { 200 buf.append( form.substring( bkst,st ) ); 201 int ed = form.indexOf( ")",st+2 ); 202 buf.append( changeForm( form.substring( st+2,ed ) ) ); 203 bkst = ed + 1; 204 st = form.indexOf( "$(",bkst ); 205 } 206 buf.append( form.substring( bkst ) ); 207 208 return buf.toString(); 209 } 210 211 /** 212 * ç¾åœ¨æ—¥ä»˜ã?時刻をフォーマットをæŒ?®šã—ã¦ã€æ‰€å¾—ã—ã¾ã™ã? 213 * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã? 214 * 215 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用ã™ã‚‹ãŸã‚ã€å‰Šé™¤ã€? 216 * 217 * @param form フォーãƒ?–‡å—å? ( ä¾?"yyyy/MM/dd HH:mm:ss" ) 218 * 219 * @return ç¾åœ¨æ—¥ä»˜ã?時刻 220 */ 221 // public static String getDate( final String form ) { 222 // DateFormat formatter = new SimpleDateFormat( form, Locale.JAPAN ); 223 // return formatter.format(new Date()); 224 // } 225 226 /** 227 * å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã®æ™‚刻フォーマットを変æ›ã—ã¦å‡ºåŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¿ã¾ã™ã? 228 * 229 * 引数㫠<key1> <val1> ã®ãƒšã‚¢æƒ??を渡ã™ã“ã¨ãŒå¯èƒ½ã§ã™ã? 230 * å…ˆã«ã€keys,vals ã®å¤‰æ›ã‚’行ã„ã¾ã™ã?form ãŒã?keys ã«ãƒžãƒƒãƒã™ã‚Œã?ã€vals ã‚? 231 * è¿”ã—ã¾ã™ã?æœ?¾Œã¾ã§ãƒžãƒƒãƒã—ãªã‘れã°ã€æ™‚刻ã®ãƒ•ォーマット変æ›ã‚’行ã„ã¾ã™ã? 232 * フォーマットã?æŒ?®šæ–¹æ³•ã?ã€java.text.SimpleDateFormat ã®æŒ?®šæ–¹æ³•ã¨åŒä¸?§ã™ã? 233 * フォーãƒ?–‡å—å?ä¾?( "yyyy/MM/dd HH:mm:ss" ) 234 * 235 * @param args 引数é…å?( 入力ファイル 出力ファイル ã‚ー??値???¥?¥?¥ 236 */ 237 public static void main( final String[] args ) throws Throwable { 238 if( args.length > 2 && ( args.length % 2 != 0 ) ) { 239 // LogWriter.log("Usage: java DateSet <inputFile> <outputFile> [<key1> <val1> ?¥?¥?¥]" ); 240 System.err.println( "Usage: java DateSet <inputFile> <outputFile> [<key1> <val1> ?¥?¥?¥]" ); 241 return ; 242 } 243 244 String[] keys = new String[ (args.length-2)/2 ]; 245 String[] vals = new String[ (args.length-2)/2 ]; 246 for( int i=1; i<=keys.length; i++ ) { 247 keys[i-1] = args[i*2]; 248 vals[i-1] = args[i*2+1]; 249 } 250 251 FileInputStream filein = new FileInputStream( args[0] ); 252 byte[] byteIn = new byte[ filein.available() ]; 253 int len = filein.read( byteIn ); 254 if( len != byteIn.length ) { 255 String errMsg = "èªã¿å–りファイルã®ãƒ??ã‚¿ãŒå?りæ¨ã¦ã‚‰ã‚Œã¾ã—ãŸã€? + 256 "File=" + args[0] + " Length=" + len + " Input=" + byteIn.length ; 257 // LogWriter.log( errMsg ); 258 System.err.println( errMsg ); 259 } 260 filein.close(); 261 262 DateSet dateSet = new DateSet(); 263 dateSet.setKeysVals( keys,vals ); 264 byte[] byteout = dateSet.change( byteIn ); 265 266 FileOutputStream fileout = new FileOutputStream( args[1] ); 267 fileout.write( byteout ); 268 fileout.close(); 269 } 270 }