TimestampFormat.java
6.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
package com.sitech.ismp.ice.syslogd;
import java.lang.*;
import java.text.*;
import java.util.*;
/**
* The TimestampFormat class implements the code necessary
* to format and parse syslog timestamps, which come in the
* flavor of 'Sep 14 15:43:06'.
*
* @version $Revision: 1.1.1.1 $
* @author Timothy Gerard Endres,
* <a href="mailto:time@ice.com">time@ice.com</a>.
* @see SyslogServer
*/
public class
TimestampFormat extends Format
{
public static final String RCS_ID = "$Id: TimestampFormat.java,v 1.1.1.1 1998/02/22 05:47:54 time Exp $";
public static final String RCS_REV = "$Revision: 1.1.1.1 $";
public static final String RCS_NAME = "$Name: $";
static public final String DEFAULT_GMT_TZID = "GMT+00";
static public final TimestampFormat
getInstance()
{
return new TimestampFormat();
}
public
TimestampFormat()
{
super();
}
public String
format( Date date )
throws IllegalArgumentException
{
TimeZone tz = TimeZone.getTimeZone
( TimestampFormat.DEFAULT_GMT_TZID );
return formatTimeZone( date, tz );
}
public String
formatTimeZone( Date date, TimeZone tz )
throws IllegalArgumentException
{
SimpleDateFormat dateFormat;
Locale loc = Locale.US; // UNDONE
dateFormat = new SimpleDateFormat( "MMM", loc );
dateFormat.setTimeZone( tz );
String month = dateFormat.format( date );
month = month.substring( 0, 3 );
dateFormat = new SimpleDateFormat( "dd HH:mm:ss", loc );
dateFormat.setTimeZone( tz );
String rest = dateFormat.format( date );
String result = new String
( month + " " + rest );
return result;
}
public StringBuffer
format( Object date, StringBuffer appendTo, FieldPosition fieldPos )
throws IllegalArgumentException
{
// UNDONE - handle fieldPos!
String tmpFormat = this.format( (Date)date );
appendTo.append( tmpFormat );
return appendTo;
}
public Date
parse( String source )
throws ParseException
{
return parseTimestamp( source );
}
public Object
parseObject( String source, ParsePosition pos )
{
Date stamp = null;
try {
stamp = this.parseTimestamp( source );
}
catch ( ParseException ex )
{
stamp = null;
}
return (Object) stamp;
}
// UNDONE - all the positions in ParseExceptions are zero.
public Date
parseTimestamp( String source )
throws ParseException
{
String monName = null;
String dateStr = null;
String hmsStr = null;
String hourStr = null;
String minStr = null;
String secStr = null;
StringTokenizer toker =
new StringTokenizer( source, " " );
int tokeCount = toker.countTokens();
if ( tokeCount != 3 )
{
throw new ParseException
( "a valid timestamp has 3 fields, not " + tokeCount, 0 );
}
try { monName = toker.nextToken(); }
catch ( NoSuchElementException ex )
{
throw new ParseException
( "could not parse month name (field 1)", 0 );
}
try { dateStr = toker.nextToken(); }
catch ( NoSuchElementException ex )
{
throw new ParseException
( "could not parse day of month (field 2)", 0 );
}
try { hmsStr = toker.nextToken(); }
catch ( NoSuchElementException ex )
{
throw new ParseException
( "could not parse time hh:mm:ss (field 3)", 0 );
}
toker = new StringTokenizer( hmsStr, ":" );
tokeCount = toker.countTokens();
if ( tokeCount != 3 )
{
throw new ParseException
( "'" +hmsStr+ "' is not a valid timestamp time string", 0 );
}
try { hourStr = toker.nextToken(); }
catch ( NoSuchElementException ex )
{
throw new ParseException
( "could not parse time hour (field 3.1)", 0 );
}
try { minStr = toker.nextToken(); }
catch ( NoSuchElementException ex )
{
throw new ParseException
( "could not parse time minute (field 3.2)", 0 );
}
try { secStr = toker.nextToken(); }
catch ( NoSuchElementException ex )
{
throw new ParseException
( "could not parse time second (field 3.3)", 0 );
}
int month = 0;
int date = 0;
int hour = 0;
int minute = 0;
int second = 0;
try { month = this.monthNameToInt( monName ); }
catch ( ParseException ex )
{
throw new ParseException
( "could not convert month name (field 1)", 0 );
}
try { date = Integer.parseInt( dateStr ); }
catch ( NumberFormatException ex )
{
throw new ParseException
( "could not convert month day (field 2)", 0 );
}
if ( date < 1 || date > 31 )
{
throw new ParseException
( "month day '" + date + "' is out of range", 0 );
}
try { hour = Integer.parseInt( hourStr ); }
catch ( NumberFormatException ex )
{
throw new ParseException
( ( "could not convert hour (field 3.1) '"
+ hourStr + "' - " + ex.getMessage() ), 0 );
}
if ( hour < 0 || hour > 24 )
{
throw new ParseException
( "hour '" + hour + "' is out of range", 0 );
}
try { minute = Integer.parseInt( minStr ); }
catch ( NumberFormatException ex )
{
throw new ParseException
( ( "could not convert minute (field 3.2) '"
+ minStr + "' - " + ex.getMessage() ), 0 );
}
if ( minute < 0 || minute > 59 )
{
throw new ParseException
( "minute '" + minute + "' is out of range", 0 );
}
try { second = Integer.parseInt( secStr ); }
catch ( NumberFormatException ex )
{
throw new ParseException
( ( "could not convert second (field 3.3) '"
+ secStr + "' - " + ex.getMessage() ), 0 );
}
if ( second < 0 || second > 59 )
{
throw new ParseException
( "second '" + second + "' is out of range", 0 );
}
Locale loc = Locale.US; // UNDONE
TimeZone tz = TimeZone.getTimeZone
( TimestampFormat.DEFAULT_GMT_TZID );
Calendar cal = Calendar.getInstance( tz, loc );
cal.setTime( new Date() );
cal.set( cal.get(Calendar.YEAR), month, date,
hour, minute, second );
Date result = new Date( cal.getTime().getTime() );
return result;
}
private int
monthNameToInt( String name )
throws ParseException
{
// UNDONE - this could be optimized by checking the
// first character, since this resolves all
// by the 'A', 'J' and 'M' months.
//
if ( name.equalsIgnoreCase( "Jan" ) )
return 0;
else if ( name.equalsIgnoreCase( "Feb" ) )
return 1;
else if ( name.equalsIgnoreCase( "Mar" ) )
return 2;
else if ( name.equalsIgnoreCase( "Apr" ) )
return 3;
else if ( name.equalsIgnoreCase( "May" ) )
return 4;
else if ( name.equalsIgnoreCase( "Jun" ) )
return 5;
else if ( name.equalsIgnoreCase( "Jul" ) )
return 6;
else if ( name.equalsIgnoreCase( "Aug" ) )
return 7;
else if ( name.equalsIgnoreCase( "Sep" ) )
return 8;
else if ( name.equalsIgnoreCase( "Oct" ) )
return 9;
else if ( name.equalsIgnoreCase( "Nov" ) )
return 10;
else if ( name.equalsIgnoreCase( "Dec" ) )
return 11;
throw new ParseException
( "unknown month name '" + name + "'", 0 );
}
}