如何使用strtotime校正夏令时

时间:2019-02-10 20:36:36

标签: php

我有一个函数,用于为过期的订阅续订返回新的过期。如果用户续约一个月,该功能将如下所示:

$unixtime = strtotime(" today + 1 month") + 86399;
$dt = date("Y-m-d", $unixtime) . ' at ' . date("H:i:s", $unixtime);
return array('unixtime' => $unixtime, 'dt' => $dt);

今天是2月10日,我希望它在2019年3月10日23:59:59返回dt。但是,它在dt作为2019-03-11在00:59:59返回。实际上,根据UTC返回的Unix纪元时间是正确的,但是当我返回dt时,它没有考虑从标准时间到DST的变化。我还怀疑当秋天的时间重叠时,新的到期时间将缩短一个小时,即22:59:59。

有什么想法吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

Datetime class可以处理。尝试以下代码:

<?php

$today = new Datetime('today - 1 second');
var_dump($today->format(DATETIME::ATOM));

$expirationDate = $today->add(new DateInterval('P1M'));
var_dump($expirationDate->format(DATETIME::ATOM));

点击here进入3v4l.org上的代码。

答案 1 :(得分:0)

arueckauer回答了我的问题...但是当他发布消息时,我遭到了两指黑客的攻击,并提出了以下建议,

$dt = date("Y-m-d 23:59:59", time());
$unixtime = strtotime("$dt + 1 month");
$newDT =  = date("Y-m-d", $unixtime) . ' at ' . date("H:i:s", $unixtime);

unixtime是用户登录时系统查看的内容,而newDT是显示的内容。