格林威治标准时间的奇怪 strtotime 一直有效到 3 月 31 日

Posted

技术标签:

【中文标题】格林威治标准时间的奇怪 strtotime 一直有效到 3 月 31 日【英文标题】:weird strtotime with GMT which worked perfectly till march 31 【发布时间】:2019-08-21 22:04:24 【问题描述】:

以一种形式动态生成选择,该形式适用于小于 3 月 31 日的日期,但适用于 4 月 1 日及之后的日期是错误的。您可以看到我专门指定了 GMT,它至少在日期:3 月 31 日完美运行。

    $today = strtotime("today GMT");
    <select name="date">
    <option value=<?php echo $d = strtotime('0 day',$today); ?>> <?php echo date('d M, Y', $d).'-'.$d; ?></option>
    <option value=<?php echo $d = strtotime('1 day',$today); ?>> <?php echo date('d M, Y', $d).'-'.$d; ?></option>
    <option value=<?php echo $d = strtotime('2 day',$today); ?>> <?php echo date('d M, Y', $d).'-'.$d; ?></option>
<-remainings->
</select>

生成的代码

28 Mar, 2019-1553731200<--Correct March 28, 2019 12:00:00 AM
29 Mar, 2019-1553817600<--Correct
30 Mar, 2019-1553904000<--Correct
31 Mar, 2019-1553990400<--Correct
01 Apr, 2019-1554073200<--Wrong March 31, 2019 11:00:00 PM  (this and remainings should be April <nextday>, 2019 12:00:00 AM)
02 Apr, 2019-1554159600<--Wrong April 1, 2019 11:00:00 PM 
03 Apr, 2019-1554246000<--Wrong April 2, 2019 11:00:00 PM
04 Apr, 2019-1554332400<--Wrong April 3, 2019 11:00:00 PM
05 Apr, 2019-1554418800<--Wrong April 4, 2019 11:00:00 PM
06 Apr, 2019-1554505200<--Wrong April 5, 2019 11:00:00 PM 

【问题讨论】:

GMT went on Daylight Saving Time 3 月 31 日凌晨 1 点。对不起,我不知道你需要做什么。也许改用 UTC? Everyday Json 文件将在提交表单时生成,文件名如&lt;unixtimestamp&gt;.json。稍后此文件将被移动应用程序访问,并且在移动应用程序中实现了相同的方法以在点击 url 之前动态生成文件名。由于这个问题,文件名与应用程序预期的不一样 > Apr-01。 【参考方案1】:

尝试将此$today = strtotime("today GMT"); 更改为此$today = strtotime("today",gmdate('U'));

当我在我的系统(2019 年 3 月 31 日 18:00 时区 EDT)上执行此 $today = strtotime("today GMT"); 时,结果为 1553990400 30 Mar, 2019 20:00

我阅读了PHP: Datetime Relative Formats Doc 并没有发现任何格式使用时区的迹象,这就是我尝试使用gmdate('U') 的原因。

这段代码:

echo "\ngmdate\n";
echo "current date: ",strtotime("today"),"<-- ",date('d M, Y H:i'),"\n";
echo "'today GMT': ",strtotime("today GMT"),"<--",date('d M, Y H:i',strtotime("today GMT")),"\n\n";
$todayGMdate = strtotime("today",gmdate('U'));

echo $todayGMdate,"<-- ",date('d M, Y H:i',$todayGMdate),"\n";
for ($i = 0; $i < 10; $i++) 
    $d=strtotime("+$i day",$todayGMdate);
    echo date('d M, Y', $d).'-'.$d," <-- ",date('d M, Y H:i',$d),"\n";

产生这个结果:

gmdate
current date: 1554091200<-- 01 Apr, 2019 10:44
'today GMT': 1554076800<--31 Mar, 2019 20:00

1554091200<-- 01 Apr, 2019 00:00
01 Apr, 2019-1554091200 <-- 01 Apr, 2019 00:00
02 Apr, 2019-1554177600 <-- 02 Apr, 2019 00:00
03 Apr, 2019-1554264000 <-- 03 Apr, 2019 00:00
04 Apr, 2019-1554350400 <-- 04 Apr, 2019 00:00
05 Apr, 2019-1554436800 <-- 05 Apr, 2019 00:00
06 Apr, 2019-1554523200 <-- 06 Apr, 2019 00:00
07 Apr, 2019-1554609600 <-- 07 Apr, 2019 00:00
08 Apr, 2019-1554696000 <-- 08 Apr, 2019 00:00
09 Apr, 2019-1554782400 <-- 09 Apr, 2019 00:00
10 Apr, 2019-1554868800 <-- 10 Apr, 2019 00:00

似乎strtotime("today GMT") 在当前语言环境中获取今天的开始,然后添加 gmt 偏移量。

我怀疑文档中的这个注释在起作用:

注意:

相对语句总是在非相对语句之后处理 陈述。这使得“2008 年 7 月 +1 周”和“2008 年 7 月 +1 周” 等价的。

此规则的例外情况是:“昨天”、“午夜”、“今天”、“中午” 和明天”。注意“明天 11:00”和“明天 11:00”是 不同的。考虑到今天的日期“2008 年 7 月 23 日”,第一个 产生“2008-07-24 11:00”,而第二个产生 “2008-07-24 00:00”。原因是这五个陈述 直接影响当前时间。

【讨论】:

AFAIU GMT 应该产生相同的时间戳,无论设备区域设置如何。如果我在这里错了,请纠正我?但是根据您上面的代码,时间戳不是确切的 12:00 AM,这就是我所追求的,因为当我说每天预先生成文件时,该文件将从上午 12:00 到晚上 11:59:59 访问。当我检查上述输出@epochconverter.com 的时间戳时,它在格林威治标准时间之前+4。我很困惑我们的代码是错误的还是php还是TIME本身:) 很抱歉,这个例子有缺陷。我已经对答案进行了澄清。

以上是关于格林威治标准时间的奇怪 strtotime 一直有效到 3 月 31 日的主要内容,如果未能解决你的问题,请参考以下文章

Coldfusion - 奇怪的解析时间结果

PHP的日期和时间

gmt时间格式是啥意思

如何在 Oracle 中获取当前的 GMT

GMT+8是啥意思

Datetime.Today in GMT in c#