2015-03-30 59 views
0

對於我的Web應用程序,我使用PHP類來對齊各種格式(如郵票和日期)中使用的日期和時間。我的應用程序是一個webcrawler,也是一個自定義的Twitter應用程序。兩者都需要每日報告,這使得準確的時間保持關鍵。更重要的是,我在整個應用程序中使用Unix時間戳格式存儲數據庫。這使我的計算變得更加容易。系統設計是通過在時間00:00:00小時設置日期的Unix時間戳,爲單個日期創建時間戳。例如,我把這個稱爲todayStamp00。PHP DateTime Class和time_zone/stamp off

我的問題是,我不能讓我的課程產生我期望的結果。它似乎有所不同,這之間的時間(),日期()等功能,它看起來隨機對我來說大多數時間。我糾正它偏離的地方,但對這種解決方案不滿意。

PS。我創建了一個組件,用於替換控制器類中現有代碼片段的每個位置。

<?php 
define(DEBUG,1); 

class DateTimeComponent { 

    private $date; 
    private $hour; 
    private $day; 
    private $timezone; 
    private $timeStamp; 
    private $nowDateTime; 
    private $todayDate; 
    private $todayDate00; 
    private $todayStamp00; 

    public function __construct() { 
     # set date object 
     $this->__setDateTime(); 
    } 

    private function __setDateTime() { 
     # Date setting object style 
      $date = new DateTime('', new DateTimeZone('Europe/Amsterdam')); 
     # set datetime for now 
      $this->nowDateTime = $date->format('Y-m-d H:i:s'); 
      if(DEBUG) echo "this->nowDateTime: ".$this->nowDateTime.PHP_EOL;   
     # add timezone offset +1 for local time Amsterdam 
      date_add($date, date_interval_create_from_date_string('1 hours')); 
      $this->timeStamp = $date->getTimestamp(); 
      if(DEBUG) echo "this->Timestamp now: ".$this->timeStamp. "\n"; 
     # set date today 00:00:00 hours 
      date_time_set($date, 0, 0, 0); 
      $this->todayDate00 = $date->format('Y-m-d H:i:s'); 
      if(DEBUG) echo "this->Today 00:00:00: ".$this->todayDate00.PHP_EOL; 
     # set date today 00:00:00 hours 
      date_add($date, date_interval_create_from_date_string('1 hours')); 
      $this->todayStamp00 = $date->getTimestamp(); 
      if(DEBUG) echo "this->TodayStamp 00:00:00: ".$this->todayStamp00.PHP_EOL; 
     $this->date = $date; 
     return; 
    } 

    public function __timestamp() { 
     return $this->timeStamp; 
    } 

    public function __nowDateTime() { 
     return $this->nowDateTime; 
    } 

    public function __todayStamp00() { 
     return $this->todayStamp00; 
    } 

    public function __todayDate00() { 
     return $this->todayDate00; 
    } 

    public function __dateXDaysFromNow($op='substract',$days='1') { 
     # calculate plus/minus days from now. Returns daydate00:00:00 
     $date = $this->date; 
     $datestring = $days." days"; 
     if($op == "add") { 
      date_add($date,date_interval_create_from_date_string($datestring)); 
     } 
     else { 
      date_sub($date,date_interval_create_from_date_string($datestring)); 
     } 
     date_time_set($date, 0, 0, 0); 
     $day = $date->format('Y-m-d H:i:s'); 
     return $day; 
    } 
} 
?> 

回答

0

我已經使它成爲可用的東西對我來說是因爲此刻我只用1個時區,這是+01:00小時,這一點也適用這個更新的類。它需要更多的代碼行才能使分區不是00的區域(+ 00:30不會工作,01:00只增加1小時)以及與腳本時區有負面區別的區域可用。那麼爲我的需求去做是件好事。當冬季降臨時,我增加了一項功能來補償荷蘭當地的夏令時校正或夏季/冬季時間。

<?php 
define('DEBUG',1); 

/* 
* Class DateTimeComponent 
* Use __contruct('timezone') with an timezone_name from timezones array 
* loads the offset, compares script timezone offset with time choosen. 
* If timezone choosen not is timezone script it sets script to desired. 
* 
* TO DO: 
* only works with zones in +00..N zones and ignores the minutes. 
* Needs convert from +00:00 and -00:00 (gmt_diff) to decimal +/- hours. 
* 
*/ 

class DateTimeComponent { 

    private $date; 
    private $hour=3600; 
    private $day=84600; 
    private $timezone; 
    private $timezones; 
    private $timeStamp; 
    private $nowDateTime; 
    private $todayDate00; 
    private $todayStamp00; 
    private $gmt_diff; 
    private $tz_offset; 

    public function __construct($tz='Europe/Berlin') { 
     # load GMT time_zones array 
     $this->timezones = $this->setTimezones(); 
     # get/set the desired zone + offset by name 
     foreach($this->timezones as $i=>$timezone) { 
      if($timezone['timezone_name'] == $tz) { 
       $this->timezone = $timezone['timezone_name']; 
       $this->gmt_diff = $timezone['gmt_diff']; 
       $operator = substr($this->gmt_diff,0,1); 
       if(substr($this->gmt_diff,1,1) == '0') { 
        $this->tz_offset = $operator."".substr($this->gmt_diff,2,1); 
       } 
       else { 
        $this->tz_offset = substr($this->gmt_diff,1,2); 
       } 
      } 
     } 
     $this->date = $this->__setDateTime(); 
     # define('DEBUG',1) 
     if(DEBUG) $this->__debug(); 
    } 

    public function __timestamp() { 
     return $this->timeStamp; 
    } 

    public function __nowDateTime() { 
     return $this->nowDateTime; 
    } 

    public function __todayStamp00() { 
     return $this->todayStamp00; 
    } 

    public function __todayDate00() { 
     return $this->todayDate00; 
    } 

    public function __dateXDaysFromNow($op='substract',$days='1') { 
     # calculate plus/minus days from now. Returns daydate00:00:00 
     $date = $this->date; 
     $datestring = $days." days"; 
     if($op == "add") { 
      date_add($date,date_interval_create_from_date_string($datestring)); 
     } 
     else { 
      date_sub($date,date_interval_create_from_date_string($datestring)); 
     } 
     date_time_set($date, 0, 0, 0); 
     $day = $date->format('Y-m-d H:i:s'); 
     return $day; 
    } 

    private function __setDateTime() {  
     # Date setting object style 
     $date = new DateTime('', new DateTimeZone($this->timezone)); 
     $this->nowDateTime = $date->format('Y-m-d H:i:s');    
     # compare real/desired 
     $seconds = date_offset_get($date); 
     $currentOffset = ($seconds/3600); 
     if($this->tz_offset != $currentOffset) 
     { 
       $offset = "$currentOffset hours"; 
     }else { 
       $offset = "$this->tz_offset hours"; 
     } 
     #set offset to disered  
     date_add($date, date_interval_create_from_date_string($offset)); 
     $this->timeStamp = ($date->getTimestamp()); 
     # set date/stamp today etc 
     date_time_set($date, 0, 0, 0); 
     $this->todayDate00 = $date->format('Y-m-d H:i:s'); 
     $this->todayStamp00 = strtotime($date->format('Y-m-d H:i:s')); 
     return $date; 
    } 

    private function __debug(){ 
     $errMsg = "<pre>DEBUG INFO DateTimeComponent".PHP_EOL; 
     $errMsg .= "date(obj) datetime: ".$this->nowDateTime.PHP_EOL; 
     $errMsg .= "date(obj) current datetime".$this->nowDateTime.PHP_EOL; 
     $errMsg .= "date(obj) current timestamp: ".$this->timeStamp.PHP_EOL; 
     $errMsg .= "date(obj) today 00:00:00 hours: ".$this->todayDate00.PHP_EOL; 
     $errMsg .= "date(obj) today 00:00:00 hours: ".$this->todayStamp00.PHP_EOL; 
     $errMsg .= "date(obj) yesterday 00:00:00 hours: ".$yesterday00 = $this->__dateXDaysFromNow().PHP_EOL; 
     $errMsg .= "yesterday 00:00:00 hours stamp: ". strtotime($yesterday00) .PHP_EOL; 
     echo $errMsg."</pre>".PHP_EOL; 
     return; 
    } 

    private function setTimezones() { 
      $timezones = array(
      array('id' => '1','timezone_name' => 'Pacific/Midway','timezone_label' => '(GMT-11:00) Midway Island, Samoa','gmt_diff' => '-11:00'), 
      array('id' => '2','timezone_name' => 'America/Adak','timezone_label' => '(GMT-10:00) Hawaii-Aleutian','gmt_diff' => '-10:00'), 
      array('id' => '3','timezone_name' => 'Etc/GMT+10','timezone_label' => '(GMT-10:00) Hawaii','gmt_diff' => '-10:00'), 
      array('id' => '4','timezone_name' => 'Pacific/Marquesas','timezone_label' => '(GMT-09:30) Marquesas Islands','gmt_diff' => '-09:30'), 
      array('id' => '5','timezone_name' => 'Pacific/Gambier','timezone_label' => '(GMT-09:00) Gambier Islands','gmt_diff' => '-09:00'), 
      array('id' => '6','timezone_name' => 'America/Anchorage','timezone_label' => '(GMT-09:00) Alaska','gmt_diff' => '-09:00'), 
      array('id' => '7','timezone_name' => 'America/Ensenada','timezone_label' => '(GMT-08:00) Tijuana, Baja California','gmt_diff' => '-08:00'), 
      array('id' => '8','timezone_name' => 'Etc/GMT+8','timezone_label' => '(GMT-08:00) Pitcairn Islands','gmt_diff' => '-08:00'), 
      array('id' => '9','timezone_name' => 'America/Los_Angeles','timezone_label' => '(GMT-08:00) Pacific Time (US & Canada)','gmt_diff' => '-08:00'), 
      array('id' => '10','timezone_name' => 'America/Denver','timezone_label' => '(GMT-07:00) Mountain Time (US & Canada)','gmt_diff' => '-07:00'), 
      array('id' => '11','timezone_name' => 'America/Chihuahua','timezone_label' => '(GMT-07:00) Chihuahua, La Paz, Mazatlan','gmt_diff' => '-07:00'), 
      array('id' => '12','timezone_name' => 'America/Dawson_Creek','timezone_label' => '(GMT-07:00) Arizona','gmt_diff' => '-07:00'), 
      array('id' => '13','timezone_name' => 'America/Belize','timezone_label' => '(GMT-06:00) Saskatchewan, Central America','gmt_diff' => '-06:00'), 
      array('id' => '14','timezone_name' => 'America/Cancun','timezone_label' => '(GMT-06:00) Guadalajara, Mexico City, Monterrey','gmt_diff' => '-06:00'), 
      array('id' => '15','timezone_name' => 'Chile/EasterIsland','timezone_label' => '(GMT-06:00) Easter Island','gmt_diff' => '-06:00'), 
      array('id' => '16','timezone_name' => 'America/Chicago','timezone_label' => '(GMT-06:00) Central Time (US & Canada)','gmt_diff' => '-06:00'), 
      array('id' => '17','timezone_name' => 'America/New_York','timezone_label' => '(GMT-05:00) Eastern Time (US & Canada)','gmt_diff' => '-05:00'), 
      array('id' => '18','timezone_name' => 'America/Havana','timezone_label' => '(GMT-05:00) Cuba','gmt_diff' => '-05:00'), 
      array('id' => '19','timezone_name' => 'America/Bogota','timezone_label' => '(GMT-05:00) Bogota, Lima, Quito, Rio Branco','gmt_diff' => '-05:00'), 
      array('id' => '20','timezone_name' => 'America/Caracas','timezone_label' => '(GMT-04:30) Caracas','gmt_diff' => '-04:30'), 
      array('id' => '21','timezone_name' => 'America/Santiago','timezone_label' => '(GMT-04:00) Santiago','gmt_diff' => '-04:00'), 
      array('id' => '22','timezone_name' => 'America/La_Paz','timezone_label' => '(GMT-04:00) La Paz','gmt_diff' => '-04:00'), 
      array('id' => '23','timezone_name' => 'Atlantic/Stanley','timezone_label' => '(GMT-04:00) Faukland Islands','gmt_diff' => '-04:00'), 
      array('id' => '24','timezone_name' => 'America/Campo_Grande','timezone_label' => '(GMT-04:00) Brazil','gmt_diff' => '-04:00'), 
      array('id' => '25','timezone_name' => 'America/Goose_Bay','timezone_label' => '(GMT-04:00) Atlantic Time (Goose Bay)','gmt_diff' => '-04:00'), 
      array('id' => '26','timezone_name' => 'America/Glace_Bay','timezone_label' => '(GMT-04:00) Atlantic Time (Canada)','gmt_diff' => '-04:00'), 
      array('id' => '27','timezone_name' => 'America/St_Johns','timezone_label' => '(GMT-03:30) Newfoundland','gmt_diff' => '-03:30'), 
      array('id' => '28','timezone_name' => 'America/Araguaina','timezone_label' => '(GMT-03:00) UTC-3','gmt_diff' => '-03:00'), 
      array('id' => '29','timezone_name' => 'America/Montevideo','timezone_label' => '(GMT-03:00) Montevideo','gmt_diff' => '-03:00'), 
      array('id' => '30','timezone_name' => 'America/Miquelon','timezone_label' => '(GMT-03:00) Miquelon, St. Pierre','gmt_diff' => '-03:00'), 
      array('id' => '31','timezone_name' => 'America/Godthab','timezone_label' => '(GMT-03:00) Greenland','gmt_diff' => '-03:00'), 
      array('id' => '32','timezone_name' => 'America/Argentina/Buenos_Aires','timezone_label' => '(GMT-03:00) Buenos Aires','gmt_diff' => '-03:00'), 
      array('id' => '33','timezone_name' => 'America/Sao_Paulo','timezone_label' => '(GMT-03:00) Brasilia','gmt_diff' => '-03:00'), 
      array('id' => '34','timezone_name' => 'America/Noronha','timezone_label' => '(GMT-02:00) Mid-Atlantic','gmt_diff' => '-02:00'), 
      array('id' => '35','timezone_name' => 'Atlantic/Cape_Verde','timezone_label' => '(GMT-01:00) Cape Verde Is.','gmt_diff' => '-01:00'), 
      array('id' => '36','timezone_name' => 'Atlantic/Azores','timezone_label' => '(GMT-01:00) Azores','gmt_diff' => '-01:00'), 
      array('id' => '37','timezone_name' => 'Europe/Belfast','timezone_label' => '(GMT) Greenwich Mean Time : Belfast','gmt_diff' => '+00:00'), 
      array('id' => '38','timezone_name' => 'Europe/Dublin','timezone_label' => '(GMT) Greenwich Mean Time : Dublin','gmt_diff' => '+00:00'), 
      array('id' => '39','timezone_name' => 'Europe/Lisbon','timezone_label' => '(GMT) Greenwich Mean Time : Lisbon','gmt_diff' => '+00:00'), 
      array('id' => '40','timezone_name' => 'Europe/London','timezone_label' => '(GMT) Greenwich Mean Time : London','gmt_diff' => '+00:00'), 
      array('id' => '41','timezone_name' => 'Africa/Abidjan','timezone_label' => '(GMT) Monrovia, Reykjavik','gmt_diff' => '+00:00'), 
      array('id' => '42','timezone_name' => 'Europe/Berlin','timezone_label' => '(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna','gmt_diff' => '+01:00'), 
      array('id' => '43','timezone_name' => 'Europe/Belgrade','timezone_label' => '(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague','gmt_diff' => '+01:00'), 
      array('id' => '44','timezone_name' => 'Europe/Brussels','timezone_label' => '(GMT+01:00) Brussels, Copenhagen, Madrid, Paris','gmt_diff' => '+01:00'), 
      array('id' => '45','timezone_name' => 'Africa/Algiers','timezone_label' => '(GMT+01:00) West Central Africa','gmt_diff' => '+01:00'), 
      array('id' => '46','timezone_name' => 'Africa/Windhoek','timezone_label' => '(GMT+01:00) Windhoek','gmt_diff' => '+01:00'), 
      array('id' => '47','timezone_name' => 'Asia/Beirut','timezone_label' => '(GMT+02:00) Beirut','gmt_diff' => '+02:00'), 
      array('id' => '48','timezone_name' => 'Africa/Cairo','timezone_label' => '(GMT+02:00) Cairo','gmt_diff' => '+02:00'), 
      array('id' => '49','timezone_name' => 'Asia/Gaza','timezone_label' => '(GMT+02:00) Gaza','gmt_diff' => '+02:00'), 
      array('id' => '50','timezone_name' => 'Africa/Blantyre','timezone_label' => '(GMT+02:00) Harare, Pretoria','gmt_diff' => '+02:00'), 
      array('id' => '51','timezone_name' => 'Asia/Jerusalem','timezone_label' => '(GMT+02:00) Jerusalem','gmt_diff' => '+02:00'), 
      array('id' => '52','timezone_name' => 'Europe/Minsk','timezone_label' => '(GMT+02:00) Minsk','gmt_diff' => '+02:00'), 
      array('id' => '53','timezone_name' => 'Asia/Damascus','timezone_label' => '(GMT+02:00) Syria','gmt_diff' => '+02:00'), 
      array('id' => '54','timezone_name' => 'Europe/Moscow','timezone_label' => '(GMT+03:00) Moscow, St. Petersburg, Volgograd','gmt_diff' => '+03:00'), 
      array('id' => '55','timezone_name' => 'Africa/Addis_Ababa','timezone_label' => '(GMT+03:00) Nairobi','gmt_diff' => '+03:00'), 
      array('id' => '56','timezone_name' => 'Asia/Tehran','timezone_label' => '(GMT+03:30) Tehran','gmt_diff' => '+03:30'), 
      array('id' => '57','timezone_name' => 'Asia/Dubai','timezone_label' => '(GMT+04:00) Abu Dhabi, Muscat','gmt_diff' => '+04:00'), 
      array('id' => '58','timezone_name' => 'Asia/Yerevan','timezone_label' => '(GMT+04:00) Yerevan','gmt_diff' => '+04:00'), 
      array('id' => '59','timezone_name' => 'Asia/Kabul','timezone_label' => '(GMT+04:30) Kabul','gmt_diff' => '+04:30'), 
      array('id' => '60','timezone_name' => 'Asia/Yekaterinburg','timezone_label' => '(GMT+05:00) Ekaterinburg','gmt_diff' => '+05:00'), 
      array('id' => '61','timezone_name' => 'Asia/Tashkent','timezone_label' => '(GMT+05:00) Tashkent','gmt_diff' => '+05:00'), 
      array('id' => '62','timezone_name' => 'Asia/Kolkata','timezone_label' => '(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi','gmt_diff' => '+05:30'), 
      array('id' => '63','timezone_name' => 'Asia/Katmandu','timezone_label' => '(GMT+05:45) Kathmandu','gmt_diff' => '+05:45'), 
      array('id' => '64','timezone_name' => 'Asia/Dhaka','timezone_label' => '(GMT+06:00) Astana, Dhaka','gmt_diff' => '+06:00'), 
      array('id' => '65','timezone_name' => 'Asia/Novosibirsk','timezone_label' => '(GMT+06:00) Novosibirsk','gmt_diff' => '+06:00'), 
      array('id' => '66','timezone_name' => 'Asia/Rangoon','timezone_label' => '(GMT+06:30) Yangon (Rangoon)','gmt_diff' => '+06:30'), 
      array('id' => '67','timezone_name' => 'Asia/Bangkok','timezone_label' => '(GMT+07:00) Bangkok, Hanoi, Jakarta','gmt_diff' => '+07:00'), 
      array('id' => '68','timezone_name' => 'Asia/Krasnoyarsk','timezone_label' => '(GMT+07:00) Krasnoyarsk','gmt_diff' => '+07:00'), 
      array('id' => '69','timezone_name' => 'Asia/Hong_Kong','timezone_label' => '(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi','gmt_diff' => '+08:00'), 
      array('id' => '70','timezone_name' => 'Asia/Irkutsk','timezone_label' => '(GMT+08:00) Irkutsk, Ulaan Bataar','gmt_diff' => '+08:00'), 
      array('id' => '71','timezone_name' => 'Australia/Perth','timezone_label' => '(GMT+08:00) Perth','gmt_diff' => '+08:00'), 
      array('id' => '72','timezone_name' => 'Australia/Eucla','timezone_label' => '(GMT+08:45) Eucla','gmt_diff' => '+08:45'), 
      array('id' => '73','timezone_name' => 'Asia/Tokyo','timezone_label' => '(GMT+09:00) Osaka, Sapporo, Tokyo','gmt_diff' => '+09:00'), 
      array('id' => '74','timezone_name' => 'Asia/Seoul','timezone_label' => '(GMT+09:00) Seoul','gmt_diff' => '+09:00'), 
      array('id' => '75','timezone_name' => 'Asia/Yakutsk','timezone_label' => '(GMT+09:00) Yakutsk','gmt_diff' => '+09:00'), 
      array('id' => '76','timezone_name' => 'Australia/Adelaide','timezone_label' => '(GMT+09:30) Adelaide','gmt_diff' => '+09:30'), 
      array('id' => '77','timezone_name' => 'Australia/Darwin','timezone_label' => '(GMT+09:30) Darwin','gmt_diff' => '+09:30'), 
      array('id' => '78','timezone_name' => 'Australia/Brisbane','timezone_label' => '(GMT+10:00) Brisbane','gmt_diff' => '+10:00'), 
      array('id' => '79','timezone_name' => 'Australia/Hobart','timezone_label' => '(GMT+10:00) Hobart','gmt_diff' => '+10:00'), 
      array('id' => '80','timezone_name' => 'Asia/Vladivostok','timezone_label' => '(GMT+10:00) Vladivostok','gmt_diff' => '+10:00'), 
      array('id' => '81','timezone_name' => 'Australia/Lord_Howe','timezone_label' => '(GMT+10:30) Lord Howe Island','gmt_diff' => '+10:30'), 
      array('id' => '82','timezone_name' => 'Etc/GMT-11','timezone_label' => '(GMT+11:00) Solomon Is., New Caledonia','gmt_diff' => '+11:00'), 
      array('id' => '83','timezone_name' => 'Asia/Magadan','timezone_label' => '(GMT+11:00) Magadan','gmt_diff' => '+11:00'), 
      array('id' => '84','timezone_name' => 'Pacific/Norfolk','timezone_label' => '(GMT+11:30) Norfolk Island','gmt_diff' => '+11:30'), 
      array('id' => '85','timezone_name' => 'Asia/Anadyr','timezone_label' => '(GMT+12:00) Anadyr, Kamchatka','gmt_diff' => '+12:00'), 
      array('id' => '86','timezone_name' => 'Pacific/Auckland','timezone_label' => '(GMT+12:00) Auckland, Wellington','gmt_diff' => '+12:00'), 
      array('id' => '87','timezone_name' => 'Etc/GMT-12','timezone_label' => '(GMT+12:00) Fiji, Kamchatka, Marshall Is.','gmt_diff' => '+12:00'), 
      array('id' => '88','timezone_name' => 'Pacific/Chatham','timezone_label' => '(GMT+12:45) Chatham Islands','gmt_diff' => '+12:45'), 
      array('id' => '89','timezone_name' => 'Pacific/Tongatapu','timezone_label' => '(GMT+13:00) Nuku\'alofa','gmt_diff' => '+13:00'), 
      array('id' => '90','timezone_name' => 'Pacific/Kiritimati','timezone_label' => '(GMT+14:00) Kiritimati','gmt_diff' => '+14:00') 
     ); 
      return $timezones; 
    } 
} 

?>