【问题标题】:momentjs: how to get the date in a specific timezonemomentjs:如何获取特定时区的日期
【发布时间】:2015-04-14 03:36:43
【问题描述】:

简而言之,我想尊重服务器的时区。我已将机器的时区设置为阿拉斯加,但我将布里斯班时区字符串传递给时刻。现在我需要moment.toDate 返回一个与我在时刻构造函数中传递的时区相同的日期实例;例如

m = moment("2016-11-20T08:00:00+10:00")
m.format() // "2016-11-20T08:00:00+10:00" 
m.toDate() // Sat Nov 19 2016 13:00:00 GMT-0900 (AKST) 

我想从输入时区的那一刻起获得Date 实例;例如以某种方式让toDate 返回Sun Nov 20 2016 08:00:00 GMT+1000 (AEST)

FWIW 我尝试了使用和不使用moment.tz.setDefault 的相同代码,虽然它正确更改了format 结果,但toDate 始终使用机器的时区!

更新

我需要这种行为的原因是一些 JavaScript 库和控件不理解 moment 并且只能使用 Date 并且当它们返回时时间/日期会出现偏差。我目前正在处理的一个示例是 jQuery UI 日期选择器控件。我希望日期选择器显示服务器上(或特定时区)上的当前日期。

提前致谢。

【问题讨论】:

    标签: javascript timezone momentjs


    【解决方案1】:

    Date 对象在内部表示 UTC 时间,并且只能在投影时使用其运行所在机器的时区。

    绝对没有办法生成使用任意时区的Date 对象。您可能遇到的任何试图操纵Date 对象(例如通过添加或减去时区偏移)的示例都存在根本缺陷。

    Moment 本身具有很好的时区支持,包括用于处理命名时区的 moment-timezone 扩展,而不仅仅是时区偏移。但是一旦你回到 Date 对象 - 你又回到了该对象行为的支配之下。

    抱歉,无法实现您的要求。也许您可以详细说明为什么您想这样做,我可以推荐一个解决方法。


    更新:关于你的更新,通常有一种机制可以从日期选择器获取值作为文本,而不是作为日期对象。对于 jQuery UI 日期选择器控件的示例,onSelect 事件已经将它作为文本提供给您,或者您可以简单地调用 .val() 而不是 .datepicker('getDate') 以将文本移出字段。一旦你有了一个文本值,你就可以随心所欲地解析它。

    同样,在设置值时,您不一定需要Date 对象。您可以将文本框的值设置为字符串,也可以将字符串传递给setDate 函数。

    在大多数情况下,您不必通过 Date 对象。但如果出于某种原因你这样做了,那么你需要人为地用一些疯狂的东西来构建一个,比如:

    var d = new Date(m.format('YYYY/MM/DD'));
    

    通常情况下,我会反对 - 但如果它只是为了将值传递给 UI 控件,那么它可能没问题。

    【讨论】:

    • 感谢您的回复。我已经为我的问题添加了真正的原因。
    【解决方案2】:

    这将使您在与时刻字符串相同的时区中获得时刻,但 toDate 始终位于本地时区。

    d = "2016-11-20T08:00:00+10:00"
    m = moment(d).utcOffset(d)
    m.format()
    m.toDate()
    

    【讨论】:

    • 感谢 Chales 的回复。我对 format 没有任何问题 - 我需要一个位于原始时区的 Date 实例。
    猜你喜欢
    • 2016-03-12
    • 2014-06-23
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2020-09-16
    • 2015-11-09
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多