View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    * 
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.log4j.helpers;
19  
20  import java.util.Calendar;
21  import java.util.TimeZone;
22  import java.util.Date;
23  import java.text.FieldPosition;
24  import java.text.ParsePosition;
25  
26  // Contributors: Arndt Schoenewald <arndt@ibm23093i821.mc.schoenewald.de>
27  
28  /**
29     Formats a {@link Date} in the format "yyyy-MM-dd HH:mm:ss,SSS" for example
30     "1999-11-27 15:49:37,459".
31  
32     <p>Refer to the <a
33     href=http://www.cl.cam.ac.uk/~mgk25/iso-time.html>summary of the
34     International Standard Date and Time Notation</a> for more
35     information on this format.
36  
37     @author Ceki G&uuml;lc&uuml;
38     @author Andrew Vajoczki
39  
40     @since 0.7.5
41  */
42  public class ISO8601DateFormat extends AbsoluteTimeDateFormat {
43    private static final long serialVersionUID = -759840745298755296L;
44  
45    public
46    ISO8601DateFormat() {
47    }
48  
49    public
50    ISO8601DateFormat(TimeZone timeZone) {
51      super(timeZone);
52    }
53  
54    static private long   lastTime;
55    static private char[] lastTimeString = new char[20];
56  
57    /**
58       Appends a date in the format "YYYY-mm-dd HH:mm:ss,SSS"
59       to <code>sbuf</code>. For example: "1999-11-27 15:49:37,459".
60  
61       @param sbuf the <code>StringBuffer</code> to write to
62    */
63    public
64    StringBuffer format(Date date, StringBuffer sbuf,
65  		      FieldPosition fieldPosition) {
66  
67      long now = date.getTime();
68      int millis = (int)(now % 1000);
69  
70      if ((now - millis) != lastTime || lastTimeString[0] == 0) {
71        // We reach this point at most once per second
72        // across all threads instead of each time format()
73        // is called. This saves considerable CPU time.
74  
75        calendar.setTime(date);
76  
77        int start = sbuf.length();
78  
79        int year =  calendar.get(Calendar.YEAR);
80        sbuf.append(year);
81  
82        String month;
83        switch(calendar.get(Calendar.MONTH)) {
84        case Calendar.JANUARY: month = "-01-"; break;
85        case Calendar.FEBRUARY: month = "-02-";  break;
86        case Calendar.MARCH: month = "-03-"; break;
87        case Calendar.APRIL: month = "-04-";  break;
88        case Calendar.MAY: month = "-05-"; break;
89        case Calendar.JUNE: month = "-06-";  break;
90        case Calendar.JULY: month = "-07-"; break;
91        case Calendar.AUGUST: month = "-08-";  break;
92        case Calendar.SEPTEMBER: month = "-09-"; break;
93        case Calendar.OCTOBER: month = "-10-"; break;
94        case Calendar.NOVEMBER: month = "-11-";  break;
95        case Calendar.DECEMBER: month = "-12-";  break;
96        default: month = "-NA-"; break;
97        }
98        sbuf.append(month);
99  
100       int day = calendar.get(Calendar.DAY_OF_MONTH);
101       if(day < 10)
102 	sbuf.append('0');
103       sbuf.append(day);
104 
105       sbuf.append(' ');
106 
107       int hour = calendar.get(Calendar.HOUR_OF_DAY);
108       if(hour < 10) {
109 	sbuf.append('0');
110       }
111       sbuf.append(hour);
112       sbuf.append(':');
113 
114       int mins = calendar.get(Calendar.MINUTE);
115       if(mins < 10) {
116 	sbuf.append('0');
117       }
118       sbuf.append(mins);
119       sbuf.append(':');
120 
121       int secs = calendar.get(Calendar.SECOND);
122       if(secs < 10) {
123 	sbuf.append('0');
124       }
125       sbuf.append(secs);
126 
127       sbuf.append(',');
128 
129       // store the time string for next time to avoid recomputation
130       sbuf.getChars(start, sbuf.length(), lastTimeString, 0);
131       lastTime = now - millis;
132     }
133     else {
134       sbuf.append(lastTimeString);
135     }
136 
137 
138     if (millis < 100)
139       sbuf.append('0');
140     if (millis < 10)
141       sbuf.append('0');
142 
143     sbuf.append(millis);
144     return sbuf;
145   }
146 
147   /**
148     This method does not do anything but return <code>null</code>.
149    */
150   public
151   Date parse(java.lang.String s, ParsePosition pos) {
152     return null;
153   }
154 }
155