用strtotime转换ISO日期时间安全吗



例如

strtotime("2018-12-06T09:04:55");
strtotime("2021-07-09T14:09:47.529751-04:00");

我在php手册中读到,使用strtotime时应该避免ISO日期,为什么?在使用strtotime之前,我应该从字符串中提取日期时间吗。

strtotime((将转换一个没有时区指示的字符串,就好像该字符串是默认时区中的时间一样(date_default_timezone_set(((。因此,用strtotime((转换类似"2018-12-06T09:04:55"的UTC时间实际上会产生错误的结果。在这种情况下使用:

<?php
function UTCdatestringToTime($utcdatestring)
{
$tz = date_default_timezone_get();
date_default_timezone_set('UTC');
$result = strtotime($utcdatestring);
date_default_timezone_set($tz);
return $result;
}
?>

如果日期字符串包含时区,strtotime也会考虑到这一点。

$strDate = "2018-12-06T09:04:55 UTC";
$ts = strtotime($strDate);  // int(1544087095)

如果日期字符串中缺少时区,则使用默认时区。我的时区是";欧洲/柏林";。

$strDate = "2018-12-06T09:04:55";
$ts = strtotime($strDate);  // int(1544083495)

因此,我们得到了一个不同的时间戳。

如果我想将另一个时区的日期字符串转换为时间戳,那么最好的解决方案是使用DateTime对象。在那里,我可以在创建对象时在第二个参数中输入正确的时区。

$strDate = "2018-12-06T09:04:55";
$dt = new DateTime($strDate, new DateTimeZone('UTC'));
$ts = $dt->getTimeStamp();  // int(1544087095)

重要提示:如果日期字符串包含有效的时区,则它的优先级高于第二个参数。

$strDate = "2018-12-06T09:04:55 UTC";
$dt = new DateTime($strDate, new DateTimeZone('Europe/Berlin'));
/*
DateTime::__set_state(array(
'date' => "2018-12-06 09:04:55.000000",
'timezone_type' => 3,
'timezone' => "UTC",
))
*/

DateTimeZone("欧洲/柏林"(在此处被忽略。

由于strtotime也接受日期字符串中的时区,因此也可以使用字符串串联来添加时区。

$strDate = "2018-12-06T09:04:55";
$ts = strtotime($strDate." UTC");  //int(1544087095)

UTCdatestringToTime函数也执行同样的操作。但是,临时更改PHP脚本中的默认时区是不好的。

相关内容

  • 没有找到相关文章

最新更新