正确格式化客户端(javascript)和服务器(PHP)之间的时间

时间:2014-09-04 15:28:28

标签: javascript php date datetime

我在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()));
}

2 个答案:

答案 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'

Demo here

答案 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