2015-11-30 112 views
0

简短的问题,但我不能得到我的手指。这段代码:ISO日期格式错误的日子

$date = '2015-12-08T00:00:00+01:00'; 
echo date('D', strtotime($date)); 

回报周一同时

$date = '2015-12-08T00:00:00'; 
echo date('D', strtotime($date)); 

回报星期二这是为什么? +01:00是针对时区的,但这不应该影响我认为的那一天。

+0

“+01:00是针对时区的,但这不应该影响我认为的那一天。”为什么不?在我下一个当地的午夜(格林威治标准时间)它将在星期二在这里,但它仍然是在美国的星期一。你在什么时区? (或者,更具体地说,您的PHP环境设置为什么时区?'echo(date_default_timezone_get());') –

+0

我在欧洲/阿姆斯特丹时间。 GMT +1。所以strtotime取决于服务器的时间?这是否意味着那个日期('D',strtotime(2015-12-08));有时星期一返回,有时星期二? –

+0

如果我将我的PHP时区设置为“欧洲/阿姆斯特丹”,我会在第一段代码中得到'Tue'结果。你是否确定*你的时区是如何设定的?你运行'echo(date_default_timezone_get());'? –

回答

1

首先我抬头看,08-12-2015实际上是Tuesday,所以现在我们知道第一个是不正确的。

PHP的date()是根据他们自己的文档的Unix时间戳。

我的看法是,当要求星期几时,将+1作为时区添加会触发计算到+0时区(UTC),因此在星期一的当天UTC时间返回23:00。

您可以执行代码的其余部分之前指定的时区:date_default_timezone_set('Europe/Amsterdam');

<?php 
date_default_timezone_set('Europe/Amsterdam'); //this is an example of a +1 timezone, choose one from http://php.net/manual/en/timezones.php 
$date = '2015-12-08T00:00:00+01:00'; 
echo date('D', strtotime($date)); 
?> 
+0

感谢您的回复。它修复了我的问题。所以从我的理解是,Unix时间戳取决于您的服务器设置。今天又学到了一些东西。 –

+0

那么这是合乎逻辑的,因为代码需要一个时间参考点:你的服务器时间,当然你可以让它与一个时间服务器同步。 –

1

strtotime将使用所提供的时区或者如果未明确使用默认时区解析您的日期字符串。我们无法从您发布的代码中看到您的服务器配置的时区,但是一旦日期被解析并转换为您的时区,时间可能在前一天合法发生,因此您看到的原因'Mon'

要么通过now参数在strtotime调用中提供时区,要么通过date_default_timezone_set全局地设置一个时区。