在momentjs和php的时区不一致



我们有问题,以获得在php和momentjs的日期时间表示同步。假设我们在莫斯科有一个时区的日期时间:

2013-06-10T10:40:00.000+04:00

用户应该看到本地时间:2013-06-10T10:40:00。不管他是在西班牙还是美国。下面的php代码将生成我们需要的适当时间:

$date = new DateTime('2013-06-10T10:40:00.000+04:00');
echo $date->format('d.m.Y H:i:s');

输出为:

10.06.2013 10:40:00

但是如果我们在前端用momentjs解析相同的datetime字符串:

moment('2013-06-10T10:40:00.000+04:00').format('D.M.YYYY h:mm:ss');

输出为:

10.6.2013 8:40:00

浏览器的时区是欧洲/柏林(+02:00)。使用utc()也会以错误的方式计算日期。我们需要的是当地的时间,所以在php的情况下,它是正确的。给momentjs一个解析字符串:

moment('2013-06-10T10:40:00.000+04:00', "YYYY-MM-DD HH:mm").format('D.M.YYYY h:mm:ss')

可以做到这一点,所以时区被删除。我们应该全局设置解析字符串,怎么设置呢?

谢谢你的建议

我相信你受到了moment.js问题611的影响——这实际上是一个功能请求,因为JavaScript本身并没有这样做。在问题评论中有一个可以接受的解决方案。请添加您自己的反馈,以及。谢谢。

更新

随着moment.js 2.1.0版本的发布,你现在可以这样做:

var input = "2013-06-10T10:40:00.000+04:00";
var m = moment(input).zone(input);
var s = m.format('D.M.YYYY h:mm:ss');

.zone(input)的额外调用将从字符串中提取偏移部分(+04:00)并将其设置为用于格式化的区域。还有其他选择。参见文档中的moment#zone。

更新# 2

随着moment.js 2.3.0版本的发布,这现在是一个单独的调用:

var m = moment.parseZone(input);

尝试将PHP时区设置为Europe/Berlin

 date_default_timezone_set("Europe/Berlin")

可能是您的PHP安装/服务器使用了不同的时区

最新更新