Php 标准时间与时区不同

Php 标准时间与时区不同,php,Php,似乎我不太了解函数strotime。我的情况是,我想将当前时间(现在)与特定时区上的特定时间进行比较 例如,具体时间为“美国/纽约”时区的“本周一14:00:00”: 我目前的代码是: $now = strtotime("now America/New_York"); if ($now > $specificTime) { //do something } 但我发现上面的$now比当前时间提前了6个小时。我从美国/纽约05:00的偏移量猜到的数字6,加上1小时的夏令时

似乎我不太了解函数
strotime
。我的情况是,我想将当前时间(现在)与特定时区上的特定时间进行比较

例如,具体时间为“美国/纽约”时区的“本周一14:00:00”:

我目前的代码是:

 $now  = strtotime("now America/New_York");
 if ($now > $specificTime) {
     //do something
 }
但我发现上面的
$now
比当前时间提前了6个小时。我从美国/纽约05:00的偏移量猜到的数字6,加上1小时的夏令时

它应该将时区从
$now
中删除,它将正常工作:

 $now  = strtotime("now");
 if ($now > $specificTime) {
     //do something
 }
有人能解释一下为什么
strttime(“现在美国/纽约”)
strttime(“现在)
”提前6小时,为什么它们不等价?真的很困惑


附言:我现在是格林尼治时间+07:00。

你可以使用
日期时间来进行此操作。我认为
标准时间中的时区设置无效

$specificTime = new DateTime("monday this week 14:00:00", new DateTimeZone("America/New_York")));

$now = new DateTime("now", new DateTimeZone("America/New_York"));
然后,您可以将unix时间戳与以下内容进行比较:

if ($now->getTimestamp() > $specificTime->getTimestamp()) {
    // do something ...
}

您可以使用
DateTime
进行此操作。我认为
strotime
中的时区设置无效

$specificTime = new DateTime("monday this week 14:00:00", new DateTimeZone("America/New_York")));

$now = new DateTime("now", new DateTimeZone("America/New_York"));
然后,您可以将unix时间戳与以下内容进行比较:

if ($now->getTimestamp() > $specificTime->getTimestamp()) {
    // do something ...
}

每个时区之间都有时间偏移

strotime()
函数将根据时区返回Unix时间戳

它将使用默认时区,除非在该参数中指定了时区

默认时区是
date\u default\u timezone\u get()的返回值。

请看下面的代码:

<?php
// UTC
echo date_default_timezone_get(), "\n";

// 2013-11-28 14:41:37
echo date('Y-m-d H:i:s', strtotime("now America/New_York")), "\n";

// 2013-11-28 09:41:37
echo date('Y-m-d H:i:s', strtotime("now")), "\n";

每个时区之间都有时间偏移

strotime()
函数将根据时区返回Unix时间戳

它将使用默认时区,除非在该参数中指定了时区

默认时区是
date\u default\u timezone\u get()的返回值。

请看下面的代码:

<?php
// UTC
echo date_default_timezone_get(), "\n";

// 2013-11-28 14:41:37
echo date('Y-m-d H:i:s', strtotime("now America/New_York")), "\n";

// 2013-11-28 09:41:37
echo date('Y-m-d H:i:s', strtotime("now")), "\n";
简单调试:

<?php

$now  = strtotime("now America/New_York");
echo date('r', $now);
// Thu, 28 Nov 2013 16:39:51 +0100
简单调试:

<?php

$now  = strtotime("now America/New_York");
echo date('r', $now);
// Thu, 28 Nov 2013 16:39:51 +0100

如果你知道不同的时区是什么,只要加上X秒,你就可以将它们转换成不同的时区。
now
now America/New\u York
为什么在你的机器位于完全不同的时区时,你会认为它们是等价的呢g“本周星期一14:00:00 America/New_York”正确。您是否尝试过使用
DateTime
,显式设置时区并进行一点日期计算?嗯,因为
strotime
返回时间戳,时间戳不依赖于时区。因此简单的想法是,这里的“现在”也等同于“现在”“在世界上任何地方。我想说的是为什么相差6个小时?因为如果你现在站在纽约
now
表示当前时间。同时,如果你在欧洲睡觉,现在是不同的时间(但同一瞬间)。如果您知道不同的时区是什么,您可以通过添加X秒来始终转换为不同的时区。当您的机器位于完全不同的时区时,为什么您希望
now
now America/New_York
具有相同的可能重复?而且,
strotime
也不是魔术。我决不想指望它能把“本周星期一14:00:00美国/纽约”说对。您是否尝试过使用
DateTime
,显式设置时区并进行一些日期计算?因为
strotime
返回时间戳,并且时间戳不依赖于时区。所以简单的思考在这里是“现在”,在世界上任何地方也等同于“现在”。我想说的是为什么相差6个小时?因为如果你现在站在纽约
now
表示当前时间。同时,如果你在欧洲睡觉,现在是不同的时间(但同一时刻)。“
+1个月
”在我看来是一个坏例子。我们多久回答一次“+1个月没有像我想的那样有效”这里的问题…;-)但我同意整体观点。我改变了这个例子,以防万一。我希望关于
+1天的问题不会没完没了。但我希望是“21:30:59”!;-)问题在于这里的“期望”概念。。。我只是太挑剔了。”
+1个月
“在我看来是个坏例子。我们多久会回答一次“+1个月没有按我认为应该的那样工作”的问题…;-)但我同意整体观点。我改变了这个例子,以防万一。我希望关于
+1天的问题不会没完没了。但我希望是“21:30:59”!;-)问题在于这里的“期望”概念。。。我只是太挑剔了。