date.php

来自「groupoffice」· PHP 代码 · 共 1,228 行 · 第 1/3 页

PHP
1,228
字号
<?php/* vim: set expandtab tabstop=4 shiftwidth=4: */// +----------------------------------------------------------------------+// | PHP Version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2003 The PHP Group                                |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license,      |// | that is bundled with this package in the file LICENSE, and is        |// | available at through the world-wide-web at                           |// | http://www.php.net/license/2_02.txt.                                 |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Authors: Baba Buehler <baba@babaz.com>                               |// |          Pierre-Alain Joye <pajoye@php.net>                          |// +----------------------------------------------------------------------+//// $Id: Date.php,v 1.4 2005/10/21 13:13:02 mschering Exp $/**@#+ * Include supporting classes */require_once $GO_CONFIG->class_path.'date/Date/TimeZone.php';require_once $GO_CONFIG->class_path.'date/Date/Calc.php';require_once $GO_CONFIG->class_path.'date/Date/Span.php';/**@#-*//**@#+ * Output formats.  Pass this to getDate(). *//** * "YYYY-MM-DD HH:MM:SS" */define('DATE_FORMAT_ISO', 1);/** * "YYYYMMSSTHHMMSS(Z|(+/-)HHMM)?" */define('DATE_FORMAT_ISO_BASIC', 2);/** * "YYYY-MM-SSTHH:MM:SS(Z|(+/-)HH:MM)?" */define('DATE_FORMAT_ISO_EXTENDED', 3);/** * "YYYY-MM-SSTHH:MM:SS(.S*)?(Z|(+/-)HH:MM)?" */define('DATE_FORMAT_ISO_EXTENDED_MICROTIME', 6);/** * "YYYYMMDDHHMMSS" */define('DATE_FORMAT_TIMESTAMP', 4);/** * long int, seconds since the unix epoch */define('DATE_FORMAT_UNIXTIME', 5);/**@#-*//** * Generic date handling class for PEAR. * * Generic date handling class for PEAR.  Attempts to be time zone aware * through the Date::TimeZone class.  Supports several operations from * Date::Calc on Date objects. * * Merijn Schering: Renamed classes because somehow they conflicted with PEAR  * installations * * @author Baba Buehler <baba@babaz.com> * @package Date * @access public */class go_date{    /**     * the year     * @var int     */    var $year;    /**     * the month     * @var int     */    var $month;    /**     * the day     * @var int     */    var $day;    /**     * the hour     * @var int     */    var $hour;    /**     * the minute     * @var int     */    var $minute;    /**     * the second     * @var int     */    var $second;    /**     * the parts of a second     * @var float     */    var $partsecond;    /**     * timezone for this date     * @var object go_date_TimeZone     */    var $tz;    /**     * Constructor     *     * Creates a new Date Object initialized to the current date/time in the     * system-default timezone by default.  A date optionally     * passed in may be in the ISO 8601, TIMESTAMP or UNIXTIME format,     * or another Date object.  If no date is passed, the current date/time     * is used.     *     * @access public     * @see setDate()     * @param mixed $date optional - date/time to initialize     * @return object Date the new Date object     */    function go_date($date = null)    {        $this->tz = go_date_TimeZone::getDefault();        if (is_null($date)) {            $this->setDate(date("Y-m-d H:i:s"));        } elseif (is_object($date)) {            $this->copy($date);        } else {            $this->setDate($date);        }    }    /**     * Set the fields of a Date object based on the input date and format     *     * Set the fields of a Date object based on the input date and format,     * which is specified by the DATE_FORMAT_* constants.     *     * @access public     * @param string $date input date     * @param int $format Optional format constant (DATE_FORMAT_*) of the input date.     *                    This parameter isn't really needed anymore, but you could     *                    use it to force DATE_FORMAT_UNIXTIME.     */    function setDate($date, $format = DATE_FORMAT_ISO)    {        if (            preg_match('/^(\d{4})-?(\d{2})-?(\d{2})([T\s]?(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?(Z|[\+\-]\d{2}:?\d{2})?)?$/i', $date, $regs)            && $format != DATE_FORMAT_UNIXTIME) {            // DATE_FORMAT_ISO, ISO_BASIC, ISO_EXTENDED, and TIMESTAMP            // These formats are extremely close to each other.  This regex            // is very loose and accepts almost any butchered format you could            // throw at it.  e.g. 2003-10-07 19:45:15 and 2003-10071945:15            // are the same thing in the eyes of this regex, even though the            // latter is not a valid ISO 8601 date.            $this->year       = $regs[1];            $this->month      = $regs[2];            $this->day        = $regs[3];            $this->hour       = isset($regs[5])?$regs[5]:0;            $this->minute     = isset($regs[6])?$regs[6]:0;            $this->second     = isset($regs[7])?$regs[7]:0;            $this->partsecond = isset($regs[8])?(float)$regs[8]:(float)0;            // if an offset is defined, convert time to UTC            // Date currently can't set a timezone only by offset,            // so it has to store it as UTC            if (isset($regs[9])) {                $this->toUTCbyOffset($regs[9]);            }        } elseif (is_numeric($date)) {            // UNIXTIME            $this->setDate(date("Y-m-d H:i:s", $date));        } else {            // unknown format            $this->year       = 0;            $this->month      = 1;            $this->day        = 1;            $this->hour       = 0;            $this->minute     = 0;            $this->second     = 0;            $this->partsecond = (float)0;        }    }    /**     * Get a string (or other) representation of this date     *     * Get a string (or other) representation of this date in the     * format specified by the DATE_FORMAT_* constants.     *     * @access public     * @param int $format format constant (DATE_FORMAT_*) of the output date     * @return string the date in the requested format     */    function getDate($format = DATE_FORMAT_ISO)    {        switch ($format) {        case DATE_FORMAT_ISO:            return $this->format("%Y-%m-%d %T");            break;        case DATE_FORMAT_ISO_BASIC:            $format = "%Y%m%dT%H%M%S";            if ($this->tz->getID() == 'UTC') {                $format .= "Z";            }            return $this->format($format);            break;        case DATE_FORMAT_ISO_EXTENDED:            $format = "%Y-%m-%dT%H:%M:%S";            if ($this->tz->getID() == 'UTC') {                $format .= "Z";            }            return $this->format($format);            break;        case DATE_FORMAT_ISO_EXTENDED_MICROTIME:            $format = "%Y-%m-%dT%H:%M:%s";            if ($this->tz->getID() == 'UTC') {                $format .= "Z";            }            return $this->format($format);            break;        case DATE_FORMAT_TIMESTAMP:            return $this->format("%Y%m%d%H%M%S");            break;        case DATE_FORMAT_UNIXTIME:            return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);            break;        }    }    /**     * Copy values from another Date object     *     * Makes this Date a copy of another Date object.     *     * @access public     * @param object Date $date Date to copy from     */    function copy($date)    {        $this->year = $date->year;        $this->month = $date->month;        $this->day = $date->day;        $this->hour = $date->hour;        $this->minute = $date->minute;        $this->second = $date->second;        $this->tz = $date->tz;    }    /**     *  Date pretty printing, similar to strftime()     *     *  Formats the date in the given format, much like     *  strftime().  Most strftime() options are supported.<br><br>     *     *  formatting options:<br><br>     *     *  <code>%a  </code>  abbreviated weekday name (Sun, Mon, Tue) <br>     *  <code>%A  </code>  full weekday name (Sunday, Monday, Tuesday) <br>     *  <code>%b  </code>  abbreviated month name (Jan, Feb, Mar) <br>     *  <code>%B  </code>  full month name (January, February, March) <br>     *  <code>%C  </code>  century number (the year divided by 100 and truncated to an integer, range 00 to 99) <br>     *  <code>%d  </code>  day of month (range 00 to 31) <br>     *  <code>%D  </code>  same as "%m/%d/%y" <br>     *  <code>%e  </code>  day of month, single digit (range 0 to 31) <br>     *  <code>%E  </code>  number of days since unspecified epoch (integer, go_date_Calc::dateToDays()) <br>     *  <code>%H  </code>  hour as decimal number (00 to 23) <br>     *  <code>%I  </code>  hour as decimal number on 12-hour clock (01 to 12) <br>     *  <code>%j  </code>  day of year (range 001 to 366) <br>     *  <code>%m  </code>  month as decimal number (range 01 to 12) <br>     *  <code>%M  </code>  minute as a decimal number (00 to 59) <br>     *  <code>%n  </code>  newline character (\n) <br>     *  <code>%O  </code>  dst-corrected timezone offset expressed as "+/-HH:MM" <br>     *  <code>%o  </code>  raw timezone offset expressed as "+/-HH:MM" <br>     *  <code>%p  </code>  either 'am' or 'pm' depending on the time <br>     *  <code>%P  </code>  either 'AM' or 'PM' depending on the time <br>     *  <code>%r  </code>  time in am/pm notation, same as "%I:%M:%S %p" <br>     *  <code>%R  </code>  time in 24-hour notation, same as "%H:%M" <br>     *  <code>%s  </code>  seconds including the decimal representation smaller than one second <br>     *  <code>%S  </code>  seconds as a decimal number (00 to 59) <br>     *  <code>%t  </code>  tab character (\t) <br>     *  <code>%T  </code>  current time, same as "%H:%M:%S" <br>     *  <code>%w  </code>  weekday as decimal (0 = Sunday) <br>     *  <code>%U  </code>  week number of current year, first sunday as first week <br>     *  <code>%y  </code>  year as decimal (range 00 to 99) <br>     *  <code>%Y  </code>  year as decimal including century (range 0000 to 9999) <br>     *  <code>%%  </code>  literal '%' <br>     * <br>     *     * @access public     * @param string format the format string for returned date/time     * @return string date/time in given format     */    function format($format)    {        $output = "";        for($strpos = 0; $strpos < strlen($format); $strpos++) {            $char = substr($format,$strpos,1);            if ($char == "%") {                $nextchar = substr($format,$strpos + 1,1);                switch ($nextchar) {                case "a":                    $output .= go_date_Calc::getWeekdayAbbrname($this->day,$this->month,$this->year);                    break;                case "A":                    $output .= go_date_Calc::getWeekdayFullname($this->day,$this->month,$this->year);                    break;                case "b":                    $output .= go_date_Calc::getMonthAbbrname($this->month);                    break;                case "B":                    $output .= go_date_Calc::getMonthFullname($this->month);                    break;                case "C":                    $output .= sprintf("%02d",intval($this->year/100));                    break;                case "d":                    $output .= sprintf("%02d",$this->day);                    break;                case "D":                    $output .= sprintf("%02d/%02d/%02d",$this->month,$this->day,$this->year);                    break;                case "e":                    $output .= $this->day * 1; // get rid of leading zero                    break;                case "E":                    $output .= go_date_Calc::dateToDays($this->day,$this->month,$this->year);                    break;                case "H":                    $output .= sprintf("%02d", $this->hour);                    break;                case "I":                    $hour = ($this->hour + 1) > 12 ? $this->hour - 12 : $this->hour;                    $output .= sprintf("%02d", $hour==0 ? 12 : $hour);                    break;                case "j":                    $output .= go_date_Calc::julianDate($this->day,$this->month,$this->year);                    break;                case "m":                    $output .= sprintf("%02d",$this->month);                    break;                case "M":                    $output .= sprintf("%02d",$this->minute);                    break;                case "n":                    $output .= "\n";                    break;                case "O":                    $offms = $this->tz->getOffset($this);                    $direction = $offms >= 0 ? "+" : "-";                    $offmins = abs($offms) / 1000 / 60;                    $hours = $offmins / 60;                    $minutes = $offmins % 60;                    $output .= sprintf("%s%02d:%02d", $direction, $hours, $minutes);                    break;                case "o":                    $offms = $this->tz->getRawOffset($this);                    $direction = $offms >= 0 ? "+" : "-";                    $offmins = abs($offms) / 1000 / 60;                    $hours = $offmins / 60;                    $minutes = $offmins % 60;                    $output .= sprintf("%s%02d:%02d", $direction, $hours, $minutes);                    break;                case "p":                    $output .= $this->hour >= 12 ? "pm" : "am";                    break;                case "P":                    $output .= $this->hour >= 12 ? "PM" : "AM";                    break;                case "r":                    $hour = ($this->hour + 1) > 12 ? $this->hour - 12 : $this->hour;                    $output .= sprintf("%02d:%02d:%02d %s", $hour==0 ?  12 : $hour, $this->minute, $this->second, $this->hour >= 12 ? "PM" : "AM");                    break;                case "R":                    $output .= sprintf("%02d:%02d", $this->hour, $this->minute);                    break;                case "s":                    $output .= sprintf("%02f", (float)((float)$this->second + $this->partsecond));                    break;                case "S":                    $output .= sprintf("%02d", $this->second);                    break;                case "t":                    $output .= "\t";                    break;                case "T":                    $output .= sprintf("%02d:%02d:%02d", $this->hour, $this->minute, $this->second);                    break;                case "w":                    $output .= go_date_Calc::dayOfWeek($this->day,$this->month,$this->year);                    break;                case "U":                    $output .= go_date_Calc::weekOfYear($this->day,$this->month,$this->year);                    break;                case "y":                    $output .= substr($this->year,2,2);                    break;                case "Y":

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?