2014-03-06 92 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'); 
    ?>