PHP日期函数不接受时区更改

时间:2010-05-22 19:21:00

标签: php datetime timezone

我已经设置了一个快速的小测试来理解和调试mySQL和PHP之间的时区。

以下是页面:http://dev.feedingo.com/test_dates.php

在日期时间字段中使用NOW()在mySQL中创建日期。我试图弄清楚的最初问题是mySQL使用的时区以及如何与PHP同步。但现在有一个更奇怪的问题。

在我的测试应用中,如果您更改时区,第一个strtotime会正确更新,但如果将其传递给date()函数则不会更改。这是我根据选择框设置时区的方式。

    $current_timezone = 'America/New_York';
if( isset( $_GET['timezone'] ) ) $current_timezone = $_GET['timezone'];

date_default_timezone_set($current_timezone);

为什么date()函数不接受时区更改的任何想法?谢谢!

2 个答案:

答案 0 :(得分:0)

date()函数运行正常。

默认时区也会影响strtotime。

请注意,更改时区时,表中唯一更改的列是timestamp列。

您需要确定(或设置)mysql运行的时区。我建议使用UTC。

然后尝试以下方法之一:

  1. 从mysql中提取日期时, 或 date_default_timezone_set( 'UTC') 在调用strtotime()之前,然后 将其设置回用户首选项 在致电日期之前
  2. 尝试将时区部分添加到从mysql返回的日期字符串中:

    //因为我们添加了一个时区部分,这将是UTC中的20:14:01。 $ actualTime = strtotime($ strDate);

  3. 这是一个可能有助于阐明的小脚本:

    <?PHP
    date_default_timezone_set('America/New_York');
    $date = '2010-05-22 20:14:01'; //assume it's from mySQL, which is operating in UTC
    
    echo strtotime($date) . ' ' . date('H:i:s', strtotime($date));
    echo "\n";
    echo strtotime($date.' -0000') . ' ' . date('H:i:s', strtotime($date . ' -0000'));
    echo "\n";
    

    输出如下:

    1274573641 20:14:01
    1274559241 16:14:01
    

    第一行在美国/纽约运行strtotime(因为这是默认值)。

    第二行在strtotime的输入中设置了明确的时区。

答案 1 :(得分:0)

试试这个。它的工作对我来说。

<?php
$time=39600;
$datetime = strtotime(date("h:i:s A"))+$time;
$datetime = date('D, d M', $datetime);
echo $datetime;

// $time obtained from table below:
//  -25200|International Date Line (West) GMT-12|
//  -21600|Midway Island, Samoa GMT-11|
//  -18000|Hawaii, Honolulu GMT-10|
//  -14400|Alaska GMT-9|
//  -10800|Pacific Standard Time, US, Canada GMT-8|
//  -7200|British Columbia N.E., Santa Fe, Mountain Time GMT-7|
//  -3600|Central America, Chicago, Guatamala, Mexico City GMT-6|
//  0|US, Canada, Bogota, Boston, New York GMT-5|
//  +3600|Canada, Santiago, Atlantic Standard Time GMT-4|
//  +7200|Brazilia, Buenos Aires, Georgetown, Greenland GMT-3|
//  +10800|Mid-Atlantic GMT-2|
//  +14400|Azores, Cape Verde Is., Western Africa Time GMT-1|
//  +18000|London, Iceland, Ireland, Morocco, Portugal GMT|
//  +21600|Amsterdam, Berlin, Bern, Madrid, Paris, Rome, GMT+1|
//  +25200|Athens, Cairo, Cape Town, Finland, Greece, Israel GMT+2|
//  +28800|Ankara, Aden, Baghdad, Beruit, Kuwait, Moscow GMT+3|
//  +32400|Abu Dhabi, Baku, Kabul, Tehran, Tbilisi, Volgograd GMT+4|
//  +36000|Calcutta, Colombo, Islamabad, Madras, New Dehli GMT+5|
//  +39600|Almaty, Dhakar, Kathmandu, Colombo, Sri Lanka GMT+6|
//  +43200|Bangkok, Hanoi, Jakarta, Phnom Penh, Australia GMT+7|
//  +46800|Taipei, Beijing, Hong Kong, Singapore, GMT+8|
//  +50400|Seoul, Tokyo, Central Australia GMT+9|
//  +54000|Brisbane, Canberra, Guam, Melbourne, Sydney, GMT+10|
//  +57600|Magadan, New Caledonia, Solomon Is. GMT+11|
//  +61200|Auckland, Fiji, Kamchatka, Marshall, Wellington, GMT+12|
?>