我在javascript中有一个日期对象,如下所示:
var date = 2014-12-01T00:00:00.000Z
如果我这样做:
var date = new Date(date);
date.setUTCMonth(date.getUTCMonth()+1);
然后toISOString()
方法显示预期值:
2015-01-01T00:00:00.000Z
但是当我通过POST将该日期时间字符串发送到PHP脚本并使用DateTime
类将其解析回日期时,我得到了这个:
2014-12-31 19:00:00 -0500
我尝试使用DateTimeZone
类设置时区,并将时区设置为我自己的UTC而没有运气:
new DateTime($_POST['DateTime'],new DateTimeZone('America/Mexico_City'));
new DateTime($_POST['DateTime'],new DateTimeZone('UTC'));
有没有办法使用Date
类在javascript中设置时区?还有另一种解决方法吗?在处理时区时,我的经验很小,甚至不是零。
更新:
根据toISOString()
方法(javascript),这是我的ISO格式的时间字符串:
2014-09-01T00:00:00.000Z
以下是我$_POST
var的内容print_r()
:
Array (
[DateTime] => 2014-09-01T00:00:00.000Z
)
这是格式化程序函数的输出,使用'%c'
格式(es_MX语言环境):
dom 31 ago 2014 19:00:00 CDT
提到的格式化函数:
function formatDate($date) {
return utf8_encode(strftime('%c', $date->getTimestamp()));
}
答案 0 :(得分:1)
我认为当你发送日期字符串时,它会以某种方式呈现不同的格式。至少在我测试时,它按预期工作:
$a = new DateTime('2015-01-01T00:00:00.000Z'); echo $a->format('Y-m-d H:i:s'); // Outputs '2015-01-01 00:00:00'
答案 1 :(得分:1)
您遇到的问题是,当您使用以下格式时
$date = '2015-01-01T00:00:00.000Z';
您正在指定时区。
注意" Z "在约会结束时,使用它相当于" nautical timezone (GMT)"
因此,当您尝试运行此代码时,即使您已将DateTimeZone
指定为构造函数参数,也将获得与预期完全相同的日期。
$dateTime = new DateTime($date, new DateTimeZone('America/Mexico_City'));
echo $dateTime->format('c'). "\n"; // 2015-01-01T00:00:00+00:00
$dateTime = new DateTime($date, new DateTimeZone('UTC'));
echo $dateTime->format('c'). "\n"; //2015-01-01T00:00:00+00:00
这是预期的PHP行为,并记录在DateTime::__construct
参数下的$timezone
documentation中:
注意:
$ timezone参数和当前时区被忽略 $ time参数要么是UNIX时间戳(例如@ 946684800),要么是 指定时区(例如2010-01-28T15:00:00 + 02:00)。
在您的情况下,您要在日期中直接指定时区(" Z "),这就是忽略DateTimeZone对象的原因。强>
要避免这种情况并设置自定义时区,请将其设置在日期时间字符串中或删除Z。:
$date = '2015-01-01T00:00:00.000';
$dateTime = new DateTime($date, new DateTimeZone('America/Mexico_City'));
echo $dateTime->format('c'). "\n"; // 2015-01-01T00:00:00-06:00
$dateTime = new DateTime($date, new DateTimeZone('UTC'));
echo $dateTime->format('c'). "\n"; // 2015-01-01T00:00:00+00:00
$date = '2015-01-01T00:00:00.000 America/Mexico_City';
$dateTime = new DateTime($date);
echo $dateTime->format('c'). "\n"; //2015-01-01T00:00:00-06:00
请在此处查看适用于不同版本PHP的代码:Demo
另请查看我最近询问的相关问题:PHP DateTime Timezones - Constructor vs Setter method