繁体   English   中英

gmdate在服务器上不一致吗?

[英]gmdate not constant across servers?

我一直在研究一个需要随着时间进行大量计算的应用程序。

为了保证一切正常,我开始:

$dateToday = strtotime(gmdate("m/d/y"));

据我所知,这应该是返回GMT日期。 那么服务器所处的时区,我应该得到相同的时间?

所以,正如我在localhost上开发的一切顺利,但当我转移到不同时区的服务器时,我开始遇到问题。

在localhost上回显“$ dateToday”给了我“1501192800”,而在服务器上做同样的事情我得到“1501214400”。 这与本地计算机和服务器之间的6h时差相同。

那我在这里错过了什么?

谢谢

 $dateToday = strtotime(gmdate("m/d/y")); 

据我所知,这应该是返回GMT日期。

一点也不。

gmdate()使用GMT时区格式化日期。 由于您只使用一个参数调用它,因此通过调用time()来获取格式化日期。

time()返回当前时间戳,即自Jan 1, 1970, 0:00:00 UTCJan 1, 1970, 0:00:00 UTC以来经过的秒数。

然后, gmdate()使用您在其第一个参数中提供的格式来生成其第二个参数的文本表示(我们看到的当前时间戳)。 gmdate("m/d/Y")返回的值gmdate("m/d/Y")07/28/2017

然后, 07/28/2017传递给strtotime() ,它尝试将其解释为日期并从中计算时间戳。 因为它不包含任何时间组件, strtotime()假定时间是0:00:00

赶紧来了。 因为作为strtotime()参数提供的字符串也不包含任何时区信息,所以PHP使用其配置来假定时区。 正如您已经发现的,由于配置不同,在两台服务器上运行代码会产生不同的结果。

对我来说, strtotime(gmdate('m/d/Y'))返回1501200000 ,这是今天( July 18, 2017 )在UTC时区开始的时间戳(时刻)(因为用于测试的PHP)使用“UTC”作为其默认时区 )。 您在不同服务器上获得的值是今天在各自时区开始的时刻。

如果我使用为我的时区( Europe/Bucharest )正确配置的PHP运行相同的代码,我得到1501189200 它与我使用UTC的值之前的10800秒,因为Europe/Bucharest目前是UTC+3 (东欧标准时间的常规+2加上1小时,因为夏令时。

PHP目前提供了一组处理日期和时间的类: DateTime名称以Date开头的其他 (在文档中找到它们)。 它们比旧的日期和时间功能更容易使用,他们也知道如何处理时区(旧功能不知道)。

创建以UTC时区存储今天开始的DateTime对象非常简单:

$dateToday = new DateTime("today 0:00:00", new DateTimeZone("UTC"));

您也可以为“now”创建一个DateTime对象(在所需的时区中),然后将其时间设置为0:00:00

$dateToday = new DateTime("now", new DateTimeZone("UTC"));
$dateToday->setTime(0, 0, 0);

对于未在代码中修改的DateTime对象(仅读取它们),您最好创建DateTimeImmutable对象。 此类可防止意外更改其存储的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM