在我的申请中,我试图计算格林尼治标准时间(英国时间)午夜时间.目前我正在这样做:
$Now = new DateTime();
$timetoMidnight = $Now->setTimezone(new DateTimeZone('Europe/London'))->diff(new DateTime('tomorrow'))->format('%h hours,%i minutes and %s seconds');

代码正在运行,但似乎落后一小时(使用GMT -1).目前时间是晚上11:49,输出是这样的:

1 hours,10 minutes and 36 seconds

我已经仔细检查了我的PHP.ini,我也将时区设置为GMT:

date.timezone = Europe/London

检查PHPinfo()也可以确认这一点.

是什么赋予了?为什么我的应用程序没有使用正确的时区?

我在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对象在构造它时都设置了正确的时区,并且意识到他们会有这样的问题.

另见巨大且信息丰富的Daylight saving time and time zone best practices

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

$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');

php – DateTime使用不正确的时区的更多相关文章

  1. 视频流 – 使用视频工具箱解码iOS 8中的h264

    需要解码h264流并获取像素缓冲区我知道iOS8上的视频工具箱可能1.如何将h264流转换为CMSampleBufferRef?

  2. ios – 访问文件属性与访问sqlite记录

    >看到上述结果后,我决定选择attributesOfItemAtPath方法.还有什么我不是考虑传递sqlite?

  3. ios – NSTimeInterval到unix时间戳

    我从cmmotionmanager获取CMDeviceMotion对象.CMDeviceMotion的一个属性是时间戳,表示为NSTimeInterval.根据文档,这允许“亚毫秒”时间戳精度.不幸的是,NSTimeInterval是自上次设备启动以来计算的,对以原始形式使用它提出了重大挑战.有没有人有一个工作代码将此NSTimeInterval转换为类似时间戳的Unix?解决方法在将磁力计值与CoreMotion事件进行比较时,我遇到了类似的问题.如果要转换这些NSTimeIntervals,您只需要计

  4. ios – 更改JSQMessagesViewController中的时间戳逻辑

    SOMessaging一天一天怎么样?

  5. 如何从iOS中的CMSampleBufferRef获取相机数据当前捕获的时间戳

    我开发和iOS应用程序,将捕获的相机数据保存到一个文件,我使用捕获CMSampleBufferRef,并将编码为H264格式,帧将使用AVAssetWriter保存到文件.我遵循示例源代码来创建此应用程序:http://www.gdcl.co.uk//2013/02/20/iOS-Video-Encoding.html现在我想获得保存的视频帧的时间戳来创建一个新的电影文件,为此我做了以下事情1)找

  6. ios – 如何维护两个不同设备之间的时钟会话?

    我正在研究iOS应用程序,它需要在接受两个设备用户时在两个设备之间维持时钟计时器会话?但我不确定如何在两台设备上都没有时间缺陷的情况下实现这一目标?

  7. Swift开发用到的一些工具类

  8. Swift&Cocoa实战之数据类型:时间日期

    时间日期NSDate在Objective-C中,可以使用如下的代码创建一个UTC的时间:但是在Swift中,如果使用如下方式:获取到的会是本地时间。

  9. swift - DateUtil

  10. swift 移动支付之【微信支付】开发步骤

    //向微信注册WXApi.registerapp2.发送预支付数据预支付数据由后台返回,格式如下[plain]viewplaincopyprint?{"appid":"wxxxxxxxxxxx","noncestr":"Hk8dsZoMOdTXGjkJ","package":"Sign=WXPay","partnerid":"01001010110","prepayid":"wx2016050000000000000000000000","sign":"B4879FFFA8B65522A04034E2D0

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部