今天在處理一個日期比較的問題,發現 DateTime 類別可以進行 1970/01/01 以前的日期比較,不過由於該類別建構式比較嚴格,所以我將他繼承後擴充改寫了一番。
程式碼在下面:

class Zyme_DateTime extends DateTime{
    function __construct($時間 = null, $時區 = null){
        if ($時間 instanceof DateTime) {
            $_時間 = $時間->format('c');
        } else if (is_int($時間)) {
            $_時間 = '@' . $時間;
        } else {
            $_時間 = (string)$時間;
        }
           
        if (is_null($時區)) {
            parent::__construct($_時間);
        } else {
            $_時區 = self::時區($時區);
            parent::__construct($_時間, $_時區);
            $this->setTimezone($_時區);
        }
    }
   
    function parse(){
        return date_parse($this->format('c'));
    }

    function 時戳(){
        return (int)$this->format('U');
    }
   
    function 凌晨(){
        $this->setTime(0,0,0);
        return $this;
    }

    function 午夜(){
        $this->setTime(23,59,59);
        return $this;
    }
   
    static function 時區($時區 = null){
        if ($時區 instanceof DateTimeZone) {
            return $時區;
        } else if (is_null($時區)) {
            $_時區 = date_default_timezone_get();
        } else if (is_numeric($時區)) {
            $_時區 = self::數字時區($時區);
        } else {
            $_時區 = self::字串時區($時區);
        }
        return new DateTimeZone($_時區);
    }

    static protected function 數字時區($時區){
        $_時區 = (Zyme_Filter::數字範圍($時區, -12, 12))
            ? (int)((float)$時區 * 3600)
            : (int)$時區;
        $_表格 = self::時區位移表格();
        $_輸出 = &$_表格[$_時區];
        return (isset($_輸出))
            ? $_輸出
            : 'UTC';
    }
   
    static protected function 字串時區($時區){
        $_表格 = self::時區識別表格();
        $_時區 = (string)$時區;
        return (isset($_表格[$_時區]))
            ? $_時區
            : 'UTC';
    }
   
    static function 時區識別表格(){
        static $_時區 = array();
        if (0 === count($_時區)) {
            $_時區 = array_flip(DateTimeZone::listIdentifiers());
        }
        return $_時區;
    }
         
    static function 時區位移表格(){
        static $_時區 = array();
        if (0 !== count($_時區)){
            return $_時區;
        }
        $_表格 = DateTimeZone::listAbbreviations();
        foreach ($_表格 as $_項目){
            foreach ($_項目 as $_內容) {
                if (false === isset($_時區[$_內容['offset']])) {
                    $_時區[$_內容['offset']] = $_內容['timezone_id'];
                }
            }
        }
        ksort($_時區);
        return $_時區;
    }   

}
創作者介紹

失落的技術

HACGIS 發表在 痞客邦 PIXNET 留言(0) 人氣()