正确格式化客户端(javascript)和服务器(PHP)之间的时间
Correctly format times between client (javascript) and the server (PHP)
我有一个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方法
- PHP和Javascript之间的Regex差异
- 使用解析为javascript源的.php,如何使用条件语句将javascript代码封装在php括号之间
- 在php和javascript onClick之间传递带有空格的值
- 如何在 PHP 和 JS 中的并发会话之间进行通信
- 如何通过jQuery Ajax在HTML和PHP之间来回传输json字符串
- 创建在Javascript和PHP之间使用的唯一代码的最简单方法
- 如何在使用模态的同时使用AJAX在js和php之间进行通信
- 如何在html标签、javascript和php之间传递变量
- Node.js和Apache/PHP之间共享的javascript资源
- 在两个HTML和PHP之间交换变量
- 有没有一种方法可以在JavaScript和PHP之间交换变量
- 如何验证JS和PHP之间的连接
- Javascript和PHP之间赋值的性能
- 如何安全地在ajax和php之间发送数据
- JavaScript和PHP之间的Gzip
- 在使用JQuery倒计时计时器时处理JavaScript和php之间的差异'
- Javascript和PHP之间的时间戳
- Javascript和PHP之间的区别
- 如何在JS和PHP之间传递UTF-8编码的字符串
- 在JavaScript和PHP之间传递语言字符