我一直致力于一个需要随着时间进行大量计算的应用程序。
为了保证一切正常,我开始:
$dateToday = strtotime(gmdate("m/d/y"));
据我了解,这应该是返回GMT日期。那么服务器所处的时区,我应该得到相同的时间吗?
所以,正如我在localhost上开发的一切顺利,但是当我搬到不同时区的服务器时,我开始遇到问题。
Echo' $ dateToday"在localhost上给了我" 1501192800",同时在服务器上做同样的事情" 1501214400"。 这与本地计算机和服务器之间的6h时差相同。
那我在这里错过了什么?
由于
答案 0 :(得分:3)
$dateToday = strtotime(gmdate("m/d/y"));
据我了解,这应该是返回GMT日期。
完全没有。
gmdate()
使用GMT时区格式化日期。由于您只使用一个参数调用它,因此通过调用time()
来获取格式化日期。
time()
返回当前时间戳,即自Jan 1, 1970, 0:00:00 UTC
以来经过的秒数。
然后,gmdate()
使用您在其第一个参数中提供的格式来生成其第二个参数的文本表示(我们看到的当前时间戳)。 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"作为其default timezone)。您在不同服务器上获得的值是今天在各自时区开始的时刻。
如果我使用为我的时区(Europe/Bucharest
)正确配置的PHP运行相同的代码,我会得到1501189200
。由10800
当前位于UTC
(东欧标准时间的常规Europe/Bucharest
加上{UTC+3
,因此我使用+2
的价值前1
秒1 *}小时,因为夏令时。
PHP目前提供了一组用于处理日期和时间的类:DateTime
和另一个classes whose name start with Date
(在文档中找到它们)。它们比旧的date & time functions更容易使用,并且他们也知道如何处理时区(旧功能不知道)。
创建一个以UTC时区存储今天开始的DateTime
对象非常简单:
$dateToday = new DateTime("today 0:00:00", new DateTimeZone("UTC"));
你也可以为"现在"创建一个DateTime
对象。 (在所需的时区中),然后将其时间设置为0:00:00
:
$dateToday = new DateTime("now", new DateTimeZone("UTC"));
$dateToday->setTime(0, 0, 0);
对于未在代码中修改的DateTime
个对象(仅读取它们),您最好创建DateTimeImmutable
个对象。此类可防止意外更改其存储的值。