Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 究竟是什么导致了每六个月一小时的时间计算错误?_Php_Date_Time_Clock_Strtotime - Fatal编程技术网

Php 究竟是什么导致了每六个月一小时的时间计算错误?

Php 究竟是什么导致了每六个月一小时的时间计算错误?,php,date,time,clock,strtotime,Php,Date,Time,Clock,Strtotime,我有以下代码: var_dump(strtotime('2020-10-25 02:05') > strtotime('-5 minutes')); 它是在我的系统时钟为2020-10-25 02:04时执行的。它的回答是false,即使时间戳在执行时明显“大于”(“小于”)于“当前时间减去5分钟”。(就在一分钟前。) 然而,在零代码更改的情况下,它对此类查询的回答是true,直到一个特定的小时,而这个时间间隔六个月 你看,我现在住的地方改成了“冬天”。这意味着,在某个时刻,我假设UTC

我有以下代码:

var_dump(strtotime('2020-10-25 02:05') > strtotime('-5 minutes'));
它是在我的系统时钟为2020-10-25 02:04时执行的。它的回答是
false
,即使时间戳在执行时明显“大于”(“小于”)于“当前时间减去5分钟”。(就在一分钟前。)

然而,在零代码更改的情况下,它对此类查询的回答是
true
,直到一个特定的小时,而这个时间间隔六个月

你看,我现在住的地方改成了“冬天”。这意味着,在某个时刻,我假设UTC午夜,时间要么向前或向后一小时

因为我的时区是UTC后两个小时,“神奇时刻”是01:00-02:00或02:00-03:00。这些细节不是重要的部分

只是想弄清楚:一旦“切换”到冬季,同一个精确的代码就不再回答false,而是回答true。整整一个小时,它都在返回错误的答案

我每六个月就有一个小时的时间来调试它,因为(据我所知)没有一种明智的方法可以将感知到的系统时间更改为PHP,对于单个脚本,而不更改整个计算机的时间,如果我这样做的话,会把所有的事情都搞糟

我到底错过了什么?很明显,这与冬季/夏季的胡说八道有关,但为什么呢?是的,
strotime
将时间转换为Unix历元,它没有时区的概念,但它从特定的历史时刻开始计算固定的秒数,那么它为什么重要呢?我的时间戳来自同一台机器,同一个PHP脚本,它不会在切换时短暂发生,而是(至少)整整一个小时

你不知道这些年来我从头发上拔出了多少头发,直到现在,在问这个问题之前,我才意识到是什么导致了这种情况的发生。当我的代码中没有任何变化导致与PHP不同的答案时,我以为我疯了。但我还是不明白为什么


你能解释一下为什么比较的两个时间戳使用相同的时区时会如此混乱吗?

从夏季到冬季转换的晚上02:05有两次可用时间。让我们考虑时间戳和时间:

for($ts = 1603580700; $ts <= 1603592300; $ts += 1800){
  echo 'ts: '.$ts.' date: '.date('Y-m-d H:i \s:I',$ts).'<br>';
}

/*
ts: 1603580700 date: 2020-10-25 01:05 s:1
ts: 1603582500 date: 2020-10-25 01:35 s:1
ts: 1603584300 date: 2020-10-25 02:05 s:1
ts: 1603586100 date: 2020-10-25 02:35 s:1
ts: 1603587900 date: 2020-10-25 02:05 s:0
ts: 1603589700 date: 2020-10-25 02:35 s:0
ts: 1603591500 date: 2020-10-25 03:05 s:0
*/
但是,始终为冬季时间提供时间戳。类似于 strotime('-5分钟')提供了一个正确的时间戳,说明示例中的ts是如何工作的


你的比较结果可能会有所不同,这取决于你是在时间改变之前还是之后的同一个时钟时间进行测试。

时区有时可能会很奇怪,顺便问一下,
date\u default\u timezone\u get()
说什么?@Viney它说的是我的本地时区。我在问这个问题之前测试过它,但具体是哪一个并不重要,是吗?你的时区是什么?它会受到夏令时的影响吗?您可能需要使用不受夏令时影响的UTC。
echo strtotime ('2020-10-25 02:05'); //1603587900