library/log4php/pattern/LoggerPatternConverterDate.php
changeset 46 f11c31f7fa3e
parent 45 a56e7f9a0463
child 47 03388ec805b4
equal deleted inserted replaced
45:a56e7f9a0463 46:f11c31f7fa3e
     1 <?php
       
     2 /**
       
     3  * Licensed to the Apache Software Foundation (ASF) under one or more
       
     4  * contributor license agreements. See the NOTICE file distributed with
       
     5  * this work for additional information regarding copyright ownership.
       
     6  * The ASF licenses this file to You under the Apache License, Version 2.0
       
     7  * (the "License"); you may not use this file except in compliance with
       
     8  * the License. You may obtain a copy of the License at
       
     9  *
       
    10  *       http://www.apache.org/licenses/LICENSE-2.0
       
    11  *
       
    12  * Unless required by applicable law or agreed to in writing, software
       
    13  * distributed under the License is distributed on an "AS IS" BASIS,
       
    14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       
    15  * See the License for the specific language governing permissions and
       
    16  * limitations under the License.
       
    17  *
       
    18  * @package log4php
       
    19  */
       
    20 
       
    21 /**
       
    22  * Returns the date/time of the logging request.
       
    23  *
       
    24  * Option: the datetime format, as used by the date() function. If
       
    25  * the option is not given, the default format 'c' will be used.
       
    26  *
       
    27  * There are several "special" values which can be given for this option:
       
    28  * 'ISO8601', 'ABSOLUTE' and 'DATE'.
       
    29  *
       
    30  * @package log4php
       
    31  * @subpackage pattern
       
    32  * @version $Revision: 1326626 $
       
    33  * @since 2.3
       
    34  */
       
    35 class LoggerPatternConverterDate extends LoggerPatternConverter {
       
    36 
       
    37     const DATE_FORMAT_ISO8601 = 'c';
       
    38 
       
    39     const DATE_FORMAT_ABSOLUTE = 'H:i:s';
       
    40 
       
    41     const DATE_FORMAT_DATE = 'd M Y H:i:s.u';
       
    42 
       
    43     private $format = self::DATE_FORMAT_ISO8601;
       
    44 
       
    45     private $specials = array(
       
    46         'ISO8601' => self::DATE_FORMAT_ISO8601,
       
    47         'ABSOLUTE' => self::DATE_FORMAT_ABSOLUTE,
       
    48         'DATE' => self::DATE_FORMAT_DATE,
       
    49     );
       
    50 
       
    51     private $useLocalDate = false;
       
    52 
       
    53     public function activateOptions() {
       
    54 
       
    55         // Parse the option (date format)
       
    56         if (!empty($this->option)) {
       
    57             if (isset($this->specials[$this->option])) {
       
    58                 $this->format = $this->specials[$this->option];
       
    59             } else {
       
    60                 $this->format = $this->option;
       
    61             }
       
    62         }
       
    63 
       
    64         // Check whether the pattern contains milliseconds (u)
       
    65         if (preg_match('/(?<!\\\\)u/', $this->format)) {
       
    66             $this->useLocalDate = true;
       
    67         }
       
    68     }
       
    69 
       
    70     public function convert(LoggerLoggingEvent $event) {
       
    71         if ($this->useLocalDate) {
       
    72             return $this->date($this->format, $event->getTimeStamp());
       
    73         }
       
    74         return date($this->format, $event->getTimeStamp());
       
    75     }
       
    76 
       
    77     /**
       
    78      * Currently, PHP date() function always returns zeros for milliseconds (u)
       
    79      * on Windows. This is a replacement function for date() which correctly
       
    80      * displays milliseconds on all platforms.
       
    81      *
       
    82      * It is slower than PHP date() so it should only be used if necessary.
       
    83      */
       
    84     private function date($format, $utimestamp) {
       
    85         $timestamp = floor($utimestamp);
       
    86         $ms = floor(($utimestamp - $timestamp) * 1000);
       
    87         $ms = str_pad($ms, 3, '0', STR_PAD_LEFT);
       
    88 
       
    89         return date(preg_replace('`(?<!\\\\)u`', $ms, $format), $timestamp);
       
    90     }
       
    91 }