【问题标题】:moment-timezone parsing the given time zonemoment-timezone 解析给定时区
【发布时间】:2016-12-06 16:08:38
【问题描述】:

我在使用时刻时区解析 Date 对象时遇到问题

问题

我正在创建一个 nodejs 应用程序,它应该使用数据库中的任意时间检查新的 Date() 对象(并采取相应的行动)。时间和时区保存在数据库中。

举例

time | timezone
11:00| US/Eastern

当调用 REST 时,我必须获取 new Date() 对象并将其转换为给定的时区,并查看当前时间是否晚于上午 9 点。但是服务器时区和持久时区不一样。

问题

我像这样创建今天的日期字符串

function getTodaysDate() {
    var today = new Date(),
        dd = today.getDate(),
        mm = today.getMonth()+1,
        yyyy = today.getFullYear();

    if(dd<10) {
        dd='0'+dd
    }

    if(mm<10) {
        mm='0'+mm
    }
    
    return yyyy +'-' + mm + '-' + dd;
    
}

并尝试使用时刻时区创建 Timestamp 对象

startTime = moment.tz(new Date(getTodaysDate() + ' ' + '11:00'), 'US/Eastern');

但框架正确地获取日期并将其转换到美国/东部时区。

所以当我打印 startTime.format();

我明白了

2016-08-01T07:00:00-04:00

我愿意

2016-08-01T11:00:00-04:00

那么有没有办法使用 moment-timezone 包来设置日期和时间并将它们视为给定的时区?

【问题讨论】:

    标签: javascript node.js momentjs


    【解决方案1】:

    所以问题是

    startTime = moment.tz('here the date goes', 'US/Eastern');
    

    是期待 ISO 格式还是手动格式化(我不知道它的语法),或者是 Date() 对象。我第一次尝试这个

    2016-08-01 11:00 
    

    Moment 库被投诉(我到办公室时会发布完整的错误消息)。

    解决方案

    添加T。

    startTime = moment.tz('2016-08-01T11:00', 'US/Eastern');
    

    我讨厌时间日期库以及我们如何跟踪时间。

    【讨论】:

    • Moment 将接受带有或不带T 分隔符的iso 格式的输入。如果您有自定义格式,则可以在两个现有参数之间为其提供格式标记。
    • 它接受了格式,但打印了“即将弃用”的错误。我不知道格式 - 现在我知道了:)
    • 查看文档中“支持的 ISO 8601 字符串”here 下的列表。如果您的输入格式是列出的格式之一,您将不会收到弃用消息。如果还有其他问题,请改用string + format 方法。它也适用于 moment.tz
    【解决方案2】:

    您不需要任何Date 对象操作。理论上,你应该能够做到:

    var zone = 'US/Eastern'
    var time = '11:00'
    
    var result = moment.tz(time, 'HH:mm', zone).format();
    

    但是,a known bug 使用 UTC 当前日期而不是时区的当前日期。在修复之前,您必须这样做:

    var zone = 'US/Eastern'
    var time = '11:00'
    
    var s = moment.tz(zone).format('YYYY-MM-DD') + ' ' + time;
    var m = moment.tz(s, zone);
    var result = m.format();
    

    (假设您输入的time 值是HH:mm 格式)

    【讨论】:

    • 哈!一个很好的解决方法+1!但是您所指的错误并不是困扰我的。检查我的答案。如果你做 new Date('11:00) 它会抛出一个异常,所以我不确定这些人是否会实现它。不过还是谢谢!
    • 您的回答假设您知道目标时区的日期。如果您从 getTodaysDate 函数中获取该日期,则您基于 local 时区 - 这可能与目标的日期相同,也可能不同,具体取决于您何时调用它。对于地球上的每个人来说,“今天”并不是同一个日历日期。
    猜你喜欢
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2017-12-21
    • 2014-08-15
    • 2021-01-02
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多