我有一个javascript中的日期对象,如下所示:
var date = 2014-12-01T00:00:00.000Z
如果我这样做:
var date = new Date(date);
date.setUTCMonth(date.getUTCMonth()+1);
然后toISOString()
方法显示期望值:
2015年1月1日00: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
以下是根据print_r()
:我的$_POST
变量的内容
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()));
}
我认为当您发送日期字符串时,它的格式会有所不同。至少当我测试这个时,它像预期的那样工作:
$a=新日期时间('2015-01-01T00:00:00.000Z');echo$a->格式('Y-m-d H:i:s');//输出"2015-01-01 00:00:00"
在这里演示。
您遇到的问题是,当您使用以下格式时
$date = '2015-01-01T00:00:00.000Z';
您正在指定时区。
请注意日期末尾的"Z",使用它相当于"航海时区(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
参数下:
注:
当$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时区-构造函数与Setter方法