PHP DateTime :: format('I')不准确的bug?

我想知道这是一个错误,还是我错过了什么。</ p>

创建一种方法来隔离DST从开启切换到关闭时的时间戳,反之亦然,我发现了DateTime :: format('I')的潜在错误。 当DST结束并且时间向后切换一小时时,DateTime :: format('I')报告开关太晚一小时。</ p>

在'America / Montreal'时区,我们 在DST结束时可以查看这些时间戳:</ p>

1414904400,Sun,02 Nov 2014 01:00:00 -0400(DST on)

1414908000,Sun,02 Nov 2014 01 :00:00-0500(DST关闭)

1414911600,Sun,2014年11月2日02:00:00 -0500(DST关闭)</ p>

注意DST在第二天结束 重复01:00:00时的时间戳。</ p>

但是,使用DateTime :: format('I'),结尾将在第三个时间戳上报告。 </ p>

  $ timezone = new DateTimezone('America / Montreal'); 
$ datetime = new DateTime('now',$ timezone);
$ datetime-&gt; setTimestamp(1414904400);
echo $ datetime-&gt; format('I');
$ datetime-&gt; setTimestamp(1414908000);
echo $ datetime-&gt; format('I');
$ datetime- &gt; setTimestamp(1414911600);
echo $ datetime-&gt; format('I');
</ code> </ pre>

返回110(应为100)</ p> \ n

如果我们使用日期('I'),我们会得到正确的答案。</ p>

  date_default_timezone_set('America / Montreal'); 
echo date('I ',1414904400);
echo date('I',1414908000);
echo date('I',1414911600);
</ code> </ pre>

返回100(正如预期的那样) </ p>


当DST开始时,DateTime :: format('I')工作正常,DST结束时似乎只会失败。</ p>

另外,我在几个不同的时区测试了几年,但我不知道这个潜在错误的深度。 需要进行更多的测试。</ p>

任何人都知道这是什么?</ p>
</ div>

展开原文

原文

I'm wondering if this is a bug, or if I missed something.

While creating a method to isolate the timestamp when DST switches from on to off and vice versa, I noticed a potential bug with DateTime::format('I'). When DST ends and the time is switched backwards one hour, DateTime::format('I') reports the switch one hour too late.

In the 'America/Montreal' timezone, we can look at these timestamps when DST ends:

1414904400, Sun, 02 Nov 2014 01:00:00 -0400 (DST on)
1414908000, Sun, 02 Nov 2014 01:00:00 -0500 (DST off)
1414911600, Sun, 02 Nov 2014 02:00:00 -0500 (DST off)

Notice the DST ends on the second timestamp when 01:00:00 is repeated.

But, using DateTime::format('I') the ending is reported on the third timestamp.

$timezone = new DateTimezone('America/Montreal');
$datetime = new DateTime('now', $timezone);
$datetime->setTimestamp(1414904400);
echo $datetime->format('I');
$datetime->setTimestamp(1414908000);
echo $datetime->format('I');
$datetime->setTimestamp(1414911600);
echo $datetime->format('I');

returns 110 (should be 100)

If we use date('I') we get the correct answer.

date_default_timezone_set('America/Montreal');
echo date('I', 1414904400);
echo date('I', 1414908000);
echo date('I', 1414911600);

returns 100 (as expected)


When DST begins DateTime::format('I') works fine, it only seems to fail when DST ends.

Also, I have tested this for a few different years in a few different timezones, but I have no idea of the depth of this potential bug. Much more testing is needed.

Anyone know what this is?

doufan8805
doufan8805 经过更多测试,PetervanderWal是正确的。整个问题是第一个时间戳(1414904400)仍然存在,第二个时间戳从未设置。因此,格式化的任何内容都将返回第一个时间戳的信息。当DST结束并且时间减少一小时时,似乎setTimestamp()不喜欢它。当我尝试更改为其他时间戳时,它很好。彼得的解决方案起作用。
接近 6 年之前 回复
dongpu3347
dongpu3347 请注意,O格式代码也返回不正确的结果,如I
接近 6 年之前 回复
douqiang1851
douqiang1851 非常感谢彼得。
接近 6 年之前 回复
dss89001
dss89001 看起来修改DateTime设置的DateTime上的时间戳是错误的。在设置后立即调用$dt->getTimestamp()会返回错误的值。解决方法(直到错误修复)是$dt=newDateTime('@1414908000');$DT->setTimezone($TZ);echo$dt->format('Y-m-dH:i:sO(I)U');
接近 6 年之前 回复
dongtuo4132
dongtuo4132 不,这不是同一个问题。我得到的是DST是打开还是关闭的错误结果,错误描述的是时间错误。他似乎正在获得DST状态的正确结果。
接近 6 年之前 回复
douzhang1115
douzhang1115 #65811肯定似乎是你所描述的同一个问题,看起来好像还没有人解决它....如果你的C有任何好处,试试看看源代码
接近 6 年之前 回复
douwen5546
douwen5546 好的,我会的。我在网上搜索并找不到任何内容,但后来我发现这个bug一定太常见了,不能错过。我想我是在怀疑自己。
接近 6 年之前 回复
dongli8862
dongli8862 如果你真的相信这是PHP的DateTime实现中的一个错误,那么为什么不将它作为bugs.php.net上的bug提出-看起来它可能已经被提出-bugs.php.net/bug.php?id=65811
接近 6 年之前 回复

1个回答




创建一种方法来隔离DST从开启切换到关闭时的时间戳,反之亦然... </ p>
</ blockquote>

该方法已作为 DateTimeZone :: GetTransitions </ code>存在。 此处的文档。 </ p>

您可以 也对确定特定日期/时间是否在过渡期内的相关问题感兴趣,这在在此答案中描述</ a >。</ p>
</ div>

展开原文

原文

While creating a method to isolate the timestamp when DST switches from on to off and vice versa ...

That method already exists as DateTimeZone::GetTransitions. Documentation here.

You may also be interested in the related problem of determining whether a particular date/time is within a transition period, which is described in this answer.

dongyu9667
dongyu9667 彼得在问题评论中的回答解决了这个问题,我同意这些发现。 很高兴这有帮助。
接近 6 年之前 回复
doulin4844
doulin4844 谢谢。 我测试了GetTransitions方法,它运行良好。 你是对的,它解决了我的问题,所以我上面的代码现在无关紧要了。 谢谢你的帮助。 你没有真正回答我的问题(关于这个bug),但你解决了我的整体问题,所以我想我会把你的答案标记为被接受。
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问