php 时区不正确,php – DateTime使用不正确的时区

我在Linux PHP 5.5.5上进行了测试,将Europe / London设置为php.ini中的时区.实际上,我也将时钟设置为四小时.我用来重现的最小代码是:

$d = new DateTime('tomorrow');

echo $d->format('c e');

(正确)输出是:

2013-10-27T00:00:00+01:00 Europe/London

我将在PHP中查找错误或时区数据中的错误.为了找出哪一个,我们将会看到今晚伦敦其他节目的其他节目. Epoch Converter告诉我这应该有一个Unix时间戳1382828400.要仔细检查时间戳,我运行PHP:

$d = new DateTime('27-10-2013');

echo $d->format('U');

它还返回1382828400.所以,让我们看看它应该显示什么……

TZ=Europe/London date --date="@1382828400" +%c

输出是:

Sun 27 Oct 2013 12:00:00 AM BST

正确!所以tzdata很好.那么让我们来看看PHP.

我运行了示例代码以及date命令,并得到以下输出:

1 hours, 29 minutes and 53 seconds

Sat Oct 26 21:30:07 UTC 2013

Sat Oct 26 22:30:07 BST 2013

当然,这是正确的.

我认为在这一点上我们已经排除了tzdata和PHP中的错误,需要查看配置问题和程序员期望.

首先,正如我之前所说,欧洲/伦敦不是UTC,它没有夏令时的概念,因此每年不会改变两次.由于它不会导致此类问题,因此服务器在UTC上运行是一种最佳做法,无论用户所处的时区如何,以及程序在内部使用UTC然后转换为/从本地时区转换的最佳做法仅显示和用户输入.

我最好的猜测是,运行PHP的服务器实际上设置为使用UTC而不是欧洲/伦敦作为其默认时区.这是我可以重现您的问题的唯一配置.该测试的结果是:

date.timezone = UTC

2 hours, 24 minutes and 36 seconds

Sat Oct 26 21:35:24 UTC 2013

Sat Oct 26 22:35:24 BST 2013

展望未来,您应该在任何可行的情况下使用UTC(以及Unix时间戳),并在处理用户输入时尽早转换为本地时间,并尽可能地在显示它时尽可能地转换为本地时间.夏季时间即将结束的像这样的边缘情况可能是一个例外,但你必须格外小心,以确保你构造的每个新的DateTime对象在构造它时都设置了正确的时区,并且意识到他们会有这样的问题.

最后,为了“修复”你的代码,让我们这样做:

$tz = new DateTimeZone('Europe/London');

$now = new DateTime('now', $tz);

$midnight = new DateTime('tomorrow', $tz);

$timeToMidnight = $now->diff($midnight);

echo $timeToMidnight->format('%h hours, %i minutes and %s seconds');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值