【问题标题】:moment timezone js returns wrong datetime时刻时区 js 返回错误的日期时间
【发布时间】:2021-07-22 12:59:19
【问题描述】:

我正在使用 Moment Timezone 获取亚洲/东京时区的当前日期时间。

代码如下

var currentDateTime = new Date(moment().tz('Asia/Tokyo').format('YYYY-MM-DDTHH:mm:ss'))

假设我当地时区的当前日期时间如下

Thu Jul 22 2021 19:49:47 GMT+0700 (Indochina Time)

我预计亚洲/东京时区的当前日期如下

Thu Jul 22 2021 21:49:47 GMT+0700 (Indochina Time)

在 Chrome 中,我得到了预期的日期时间。 但是在我 iPhone 上的 Safari 中,我得到了错误的日期时间。

Fri Jul 23 2021 04:49:47 GMT+0700 (Indochina Time)

返回的当前日期时间似乎是正确的当前日期时间加上 7 小时。

这是我的环境

iPhone : iPhone 6

iOS:12.5.4

【问题讨论】:

    标签: javascript momentjs moment-timezone


    【解决方案1】:

    您遇到的问题是由 Date 构造函数根据本地时区(在 Chrome 中)和 UTC(在 Safari 中?)解析时间引起的。

    在给定的时间内,此代码

    moment().tz('Asia/Tokyo').format('YYYY-MM-DDTHH:mm:ss')
    

    返回

    "2021-07-22T21:49:47"
    

    然后将这个时间传递给 Date 构造函数:

    var currentDateTime = new Date("2021-07-22T21:49:47")
    

    由于此字符串没有时区信息,因此假定它位于设备的本地时区 (Chrome) 或 UTC (Safari) 中,这会给出错误的日期对象。

    虽然您可以将时区注入此字符串 (using ZZ),但您可以使用以下方法从 moment 对象构建 Date 对象:

    var currentDateTime = moment().tz('Asia/Tokyo').toDate()
    

    但这实际上与

    相同
    var currentDateTime = new Date()
    

    如果预期的输出是格式的字符串:

    "Thu Jul 22 2021 21:49:47 GMT+0900 (Japan Standard Time)"
    

    你能得到的最接近的是:

    moment().tz('Asia/Tokyo').format('ddd MMM D YYYY, h:mm:ss a [GMT]ZZ (z)')
    // Thu Jul 22 2021 21:49:47 GMT+0900 (JST)
    

    另外,还有本地化的“月份名称、月份日期、星期几、年份、时间”格式:

    moment().tz('Asia/Tokyo').format('llll (z)')
    // In my locale, I get:
    // Thu, Jul 22, 2021 9:49 PM (JST)
    

    查看Moment display format documentation 了解更多选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2014-12-27
      • 2020-10-15
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多