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

Correctly format times between client (javascript) and the server (PHP)

本文关键字:PHP 之间 时间 服务器 客户端 javascript 格式化      更新时间:2023-09-26

我有一个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方法