2014-03-06 60 views
4

我發現了一些我無法真正解釋的東西,也許這裏有人可以給我一個提示。date()和gmdate()的不同結果

我有下面的測試代碼,即打印格式2個時間戳,一個是2013年3月31日,一個用於2014年3月31日,使用date()gmdate()

<?php 

function print_date($timestamp, $year) { 
    // Add timezone offset for germany 
    $timestamp += 3600; 
    print "in $year\n"; 
    print "date: " . date('d.m.Y H:i:s', $timestamp) . "\n"; 
    print "gmdate: " . gmdate('d.m.Y H:i:s', $timestamp) . "\n"; 
    print "\n"; 
} 

$end_2013 = 1364684400; // 31.03.2013 
$end_2014 = 1396216800; // 31.03.2014 
print_date($end_2013, '2013'); 
print_date($end_2014, '2014'); 

print "Default timezone: " . date_default_timezone_get() . "\n"; 

結果讓我吃驚:

in 2013 
date: 31.03.2013 01:00:00 
gmdate: 31.03.2013 00:00:00 

in 2014 
date: 31.03.2014 01:00:00 
gmdate: 30.03.2014 23:00:00 

Default timezone: Europe/Berlin 

2014年的差異從哪裏來?我的第一個想法是夏令時,但爲什麼在2013年沒有效果? 爲什麼2014年有2小時的差異,但2013年只有1小時的差距?

+0

什麼是您的默認時區? – Ramesh

+0

@Ramesh歐洲/柏林 – berliner

回答

7

夏令柏林開始於

2013 Sunday, 31 March, 02:00 
2014 Sunday, 30 March, 02:00 

您指定的時間價值對於每個日期是當天00:00,所以在2013年3月31日的星期天是之前凌晨2點,所以沒有夏令時; 2014年是凌晨2點之後,3月30日

+0

啊,好吧,你是正確的根據http://www.timeanddate.com/worldclock/timezone.html?n=37 – berliner

3

假設您已經檢查過文檔。 gmdatedate

改變它

print "date: " . date('d.m.Y', $timestamp) . "\n"; 
print "gmdate: " . gmdate('d.m.Y', $timestamp) . "\n"; 

與此

print "date: " . date('d.m.Y H:i:s', $timestamp) . "\n"; 
print "gmdate: " . gmdate('d.m.Y H:i:s', $timestamp) . "\n"; 

,你會發現差別。

+0

但爲什麼我在2014年有2個小時的差異,而我在2013年只有1個小時的差異? – berliner

+0

感謝您的回答,我已經用您的輸入更新了我的問題。 – berliner

+0

是的,這是wiered .. – zzlalani

2

這是一個DayLight保存問題?

this,似乎2013年3月31日02:00:00更改爲03:00:00

0

gmdate()根據默認的時區GMT/UTC日期和時間,但date()總是格式總是格式化

試試這個

<?php 
    date_default_timezone_set("Asia/Bangkok"); 
    echo gmdate('Y-m-d H:i:s'); 
    echo date('Y-m-d H:i:s'); 
    ?>