我找到了一些我无法解释的东西,也许有人可以给我一个提示。
我有以下测试代码,使用date()
和gmdate()
打印2个格式化的时间戳,一个用于31.03.2013,另一个用于31.03.2014:
<?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 :(得分:8)
柏林的夏令时从
开始2013 Sunday, 31 March, 02:00
2014 Sunday, 30 March, 02:00
每个日期的指定时间值是该日期的00:00,因此对于2013年3月31日星期日,之前凌晨2点,因此没有夏令时; 2014年是3月30日凌晨2点之后
答案 1 :(得分:3)
改变它
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";
你会发现差异。
答案 2 :(得分:2)
这是DayLight Saving问题吗?
根据this,似乎2013-03-31 02:00:00改为03:00:00
答案 3 :(得分:1)
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');
?>