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 * @throws Throwable ãªã‚“らã‹ã?エラーãŒç™ºç”Ÿã—ãŸå?åˆã?
237 */
238 public static void main( final String[] args ) throws Throwable {
239 if( args.length > 2 && ( args.length % 2 != 0 ) ) {
240 // LogWriter.log("Usage: java DateSet <inputFile> <outputFile> [<key1> <val1> ?¥?¥?¥]" );
241 System.err.println( "Usage: java DateSet <inputFile> <outputFile> [<key1> <val1> ?¥?¥?¥]" );
242 return ;
243 }
244
245 String[] keys = new String[ (args.length-2)/2 ];
246 String[] vals = new String[ (args.length-2)/2 ];
247 for( int i=1; i<=keys.length; i++ ) {
248 keys[i-1] = args[i*2];
249 vals[i-1] = args[i*2+1];
250 }
251
252 FileInputStream filein = new FileInputStream( args[0] );
253 byte[] byteIn = new byte[ filein.available() ];
254 int len = filein.read( byteIn );
255 if( len != byteIn.length ) {
256 String errMsg = "èªã¿å–りファイルã®ãƒ??ã‚¿ãŒå?りæ¨ã¦ã‚‰ã‚Œã¾ã—ãŸã€? +
257 "File=" + args[0] + " Length=" + len + " Input=" + byteIn.length ;
258 // LogWriter.log( errMsg );
259 System.err.println( errMsg );
260 }
261 filein.close();
262
263 DateSet dateSet = new DateSet();
264 dateSet.setKeysVals( keys,vals );
265 byte[] byteout = dateSet.change( byteIn );
266
267 FileOutputStream fileout = new FileOutputStream( args[1] );
268 fileout.write( byteout );
269 fileout.close();
270 }
271 }