【问题标题】:How to create time in a specific time zone with moment.js如何使用 moment.js 在特定时区创建时间
【发布时间】:2013-08-29 04:36:18
【问题描述】:

我有这个后端,它会在设定的时区向我发送一个预先格式化的时间,但没有关于所述时区的任何信息。字符串如下:“2013-08-26 16:55:00”。

我可以用这个字符串创建一个新的 moment.js 实例:

var time = moment("2013-08-26 16:55:00") //this creates time in my tz

但这只会在我自己的时区创建一个实例。

Moment.js 有一个插件,可以在特定时区创建对象的实例,效果很好,但我不能说我希望对象指向什么时间。

如果我在纽约并且我这样做:

var time = moment("2013-08-26 16:55:00").tz("America/Los_Angeles");

结果时间将是 13:55 而不是 16:55,但在洛杉矶。

我想要创建一个显示 16:55 的实例,但在洛杉矶时间。

我问的原因是因为我想这样做:

var now = moment.tz("America/Los_Angeles");
var end = moment("2013-08-26 16:55:00"); //plus something to convert LA time

var timeLeft = end.diff(now, "minutes");

有没有办法做到这一点?

【问题讨论】:

    标签: javascript timezone momentjs


    【解决方案1】:

    在大多数情况下,您可以简单地这样做:

    moment.tz("2013-08-26 16:55:00", "America/Los_Angeles")
    

    如果需要输入非ISO8601,则第二个参数指定格式字符串,第三个参数指定时区:

    moment.tz("8/26/2013 4:55 pm", "M/D/YYYY h:mm a", "America/Los_Angeles")
    

    而如果你需要使用moment的“严格解析”模式,则进入第三个参数,时区移动到第四个位置:

    moment.tz("8/26/2013 4:55 pm", "M/D/YYYY h:mm a", true, "America/Los_Angeles")
    

    【讨论】:

    • 如果还需要使用特定的格式和严格的解析,我该怎么做?
    • @Jan - 更新了解释的答案。谢谢。
    • @MattJohnson 这项工作对 ex for 'America/New_York' 有何影响?似乎它只是捕获了浏览器的时区
    • @andi - moment.js 默认使用浏览器的时区并支持 UTC。 moment-timezone 添加了对命名 IANA 时区的支持,例如 America/New_York
    【解决方案2】:

    如果要计算特定时区中的所有内容,则要使用设置默认时区

    A) moment.tz.setDefault("America/Los_Angeles");

    对于我的用例(在 node.js 项目中),我只是在需要像这样的时刻模块后立即设置它:

    let moment = require('moment');
    require('moment-timezone');
    moment.tz.setDefault("America/Los_Angeles");
    

    此后对moment() 的所有调用都会在“America/Los_Angeles”设置中创建时间,这与使用不同:

    B)moment.tz("2017-03-04 00:00", "America/Los_Angeles")

    C)moment("2017-03-04 00:00").tz("America/Los_Angeles")

    两者都会在 UTC 时间中创建时刻对象(除非您已经更改了默认值),然后将其转换为洛杉矶时区。

    在浏览器控制台中运行上面的 B 或 C 会产生:

    _d: Fri Mar 03 2017 16:00:00 GMT-0800 (PST)
    _i: "2017-3-4 00:00"
    

    通知 _d 显示 3 月 3 日下午 4:00;这是因为 moment 对象是在 UTC 时间 3 月 4 日凌晨 12:00 创建的,然后转换为太平洋时区,比前一天晚 8 小时。

    来源:http://momentjs.com/timezone/docs/#/using-timezones/default-timezone/

    【讨论】:

    • 我想补充一点,虽然这会起作用,但不推荐。最好默认为 UTC 时间以及以 UTC 存储时间,并在必要时根据用户的时区转换为本地时间。它会让你免于许多麻烦——不是全部,因为时区非常混乱。
    • 如何将 UTC 时间转换为时区特定日期,当我尝试转换时,它会减少到 -1 或 +1?
    【解决方案3】:

    安装时刻-时区

    > npm install moment-timezone

    或查看https://momentjs.com/timezone/docs/

    .tz(字符串,字符串)

    moment.tz("2020-01-02 13:33:37", "Iran/Tehran")

    【讨论】:

      【解决方案4】:

      只是为了说清楚一些,这在其他答案中有所暗示,但并未真正说明:

      • 您绝对必须
        • 使用 ISO8601 作为日期格式或
        • 指定字符串的格式

      .. 使用.tz(string datetime, [string format,] string zone) 函数时,如果您想将您给出的datetime 参数解释为您给出的zone。如果省略format,请务必传递 ISO8601 格式的字符串


      我转了两天,因为我的 API 提供了一个时间字符串,如 "03 Feb 2021 15:00",当然,它解析正常,但它总是使用我本地机器上的时区,然后转换为我给的时区:

      //this always resulted in "2021-02-03 10:00 EST" if run on a machine in UTC
      moment.tz("03 Feb 2021 15:00", "America/Indianapolis").format("YYYY-MM-DD HH:mm z")
      

      这非常令人困惑:解析显然工作正常,因为日期是正确的,但时间总是错误的,无论机器和给定区域字符串之间存在多少小时

      切换到 ISO 格式输入有效:

      //this always resulted in "2021-02-03 15:00 EST" if run on a machine in UTC
      moment.tz("2021-02-03 15:00", "America/Indianapolis").format("YYYY-MM-DD HH:mm z")
      

      正如声明:

      //this always resulted in "2021-02-03 15:00 EST" if run on a machine in UTC
      moment.tz("03 Feb 2021 15:00", "DD MMM YYYY HH:mm", "America/Indianapolis").format("YYYY-MM-DD HH:mm z")
      

      我希望这可以节省一些时间

      【讨论】:

        【解决方案5】:

        我有一个类似的问题,我不得不使用纽约的时间,所以我不得不考虑夏令时。我尝试使用上述几个答案,但无法使其正常工作。然后我像下面的代码解决了我的问题

        import moment from 'moment-timezone'
        
        const time = timestamp
        const offset = moment.tz.zone('America/New_York')?.parse(time)
        const date = moment(time).add(offset, 'minutes').toISOString()
        

        或者你可以这样做,当你在本地显示时,它会自己考虑时间偏移。

        const time = moment.tz(timestamp, 'America/New_York')
        const localtz = moment.tz.guess()
        const date = time.clone().tz(localtz)
        

        这为您提供了一个 ISO 字符串,您可以按如下方式使用它

        moment(date).local().format('dddd, MMM DD YYYY, hh:mm A')

        或以您想要显示的任何格式

        【讨论】:

        • 您好,您的回答部分对我有用,如何知道是否根据时区添加或减去偏移量,如果我们更改时区,它会给出负数的偏移量吗?
        • @Kishor 我添加了第二种方法。它应该给你正或负的偏移量,所以你只需要添加它
        • 谢谢,在这里我输入了 UTC 字符串格式,当我尝试转换时它被减少到 -1。如何将 UTC 时间转换为时区特定日期?
        • @Kishor 您是否仔细检查了输入日期/系统时区?如果它不正确,那么您可以在初始时刻添加一个小时作为 add(1, 'hour')。碰巧有些api没有正确的UTC时间,或者他们的UTC时间实际上是他们的当地时间
        猜你喜欢
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        • 2014-10-28
        • 2020-04-28
        • 2018-10-03
        • 2022-01-16
        相关资源
        最近更新 更多