momentjs和php中的时区不一致

时间:2013-04-23 19:21:58

标签: php datetime timezone momentjs

我们遇到问题,需要在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在前端解析相同的日期时间字符串:

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')

可以解决问题,因此删除了时区。但实际上我们应该全局设置解析字符串,但是如何?

感谢您的建议。

2 个答案:

答案 0 :(得分:5)

我相信你受moment.js issue 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);

答案 1 :(得分:0)

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

 date_default_timezone_set("Europe/Berlin")

您的PHP安装/服务器可能正在使用不同的时区。