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.Date;
    21  import java.util.Calendar;
    22  import java.util.TimeZone;
    23  import java.text.FieldPosition;
    24  import java.text.ParsePosition;
    25  import java.text.DateFormat;
    26
    27
    28  /**
    29     Formats a {@link Date} in the format "HH:mm:ss,SSS" for example,
    30     "15:49:37,459".
    31
    32     @author Ceki G&uuml;lc&uuml;
    33     @author Andrew Vajoczki
    34
    35     @since 0.7.5
    36  */
    37  public class AbsoluteTimeDateFormat extends DateFormat {
    38     private static final long serialVersionUID = -388856345976723342L;
    39
    40    /**
    41       String constant used to specify {@link
    42       org.apache.log4j.helpers.AbsoluteTimeDateFormat} in layouts. Current
    43       value is <b>ABSOLUTE</b>.  */
    44    public final static String ABS_TIME_DATE_FORMAT = "ABSOLUTE";
    45
    46    /**
    47       String constant used to specify {@link
    48       org.apache.log4j.helpers.DateTimeDateFormat} in layouts.  Current
    49       value is <b>DATE</b>.
    50    */
    51    public final static String DATE_AND_TIME_DATE_FORMAT = "DATE";
    52
    53    /**
    54       String constant used to specify {@link
    55       org.apache.log4j.helpers.ISO8601DateFormat} in layouts. Current
    56       value is <b>ISO8601</b>.
    57    */
    58    public final static String ISO8601_DATE_FORMAT = "ISO8601";
    59
    60    public
    61    AbsoluteTimeDateFormat() {
    62      setCalendar(Calendar.getInstance());
    63    }
    64
    65    public
    66    AbsoluteTimeDateFormat(TimeZone timeZone) {
    67      setCalendar(Calendar.getInstance(timeZone));
    68    }
    69
    70    private static long   previousTime;
    71    private static char[] previousTimeWithoutMillis = new char[9]; // "HH:mm:ss."
    72
    73    /**
    74       Appends to <code>sbuf</code> the time in the format
    75       "HH:mm:ss,SSS" for example, "15:49:37,459"
    76
    77       @param date the date to format
    78       @param sbuf the string buffer to write to
    79       @param fieldPosition remains untouched
    80      */
    81    public
    82    StringBuffer format(Date date, StringBuffer sbuf,
    83  		      FieldPosition fieldPosition) {
    84
    85      long now = date.getTime();
    86      int millis = (int)(now % 1000);
    87
    88      if ((now - millis) != previousTime || previousTimeWithoutMillis[0] == 0) {
    89        // We reach this point at most once per second
    90        // across all threads instead of each time format()
    91        // is called. This saves considerable CPU time.
    92
    93        calendar.setTime(date);
    94
    95        int start = sbuf.length();
    96
    97        int hour = calendar.get(Calendar.HOUR_OF_DAY);
    98        if(hour < 10) {
    99  	sbuf.append('0');
    100       }
    101       sbuf.append(hour);
    102       sbuf.append(':');
    103
    104       int mins = calendar.get(Calendar.MINUTE);
    105       if(mins < 10) {
    106 	sbuf.append('0');
    107       }
    108       sbuf.append(mins);
    109       sbuf.append(':');
    110
    111       int secs = calendar.get(Calendar.SECOND);
    112       if(secs < 10) {
    113 	sbuf.append('0');
    114       }
    115       sbuf.append(secs);
    116       sbuf.append(',');
    117
    118       // store the time string for next time to avoid recomputation
    119       sbuf.getChars(start, sbuf.length(), previousTimeWithoutMillis, 0);
    120
    121       previousTime = now - millis;
    122     }
    123     else {
    124       sbuf.append(previousTimeWithoutMillis);
    125     }
    126
    127
    128
    129     if(millis < 100)
    130       sbuf.append('0');
    131     if(millis < 10)
    132       sbuf.append('0');
    133
    134     sbuf.append(millis);
    135     return sbuf;
    136   }
    137
    138   /**
    139      This method does not do anything but return <code>null</code>.
    140    */
    141   public
    142   Date parse(String s, ParsePosition pos) {
    143     return null;
    144   }
    145 }