【问题标题】:Timezone inconsistency in momentjs and phpmomentjs 和 php 中的时区不一致
【发布时间】:2013-04-17 03:36:56
【问题描述】:

我们在使 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')

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

感谢您的建议。

【问题讨论】:

    标签: php datetime timezone momentjs


    【解决方案1】:

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

    更新

    随着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);
    

    【讨论】:

    • 谢谢,我会参与其中。
    【解决方案2】:

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

     date_default_timezone_set("Europe/Berlin")
    

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

    【讨论】:

    • 时区设置正确。 php 显示也恰到好处。 Momentjs 是个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多