【问题标题】:Momentjs timezone - getting date at time in specific timezoneMomentjs 时区 - 在特定时区的时间获取日期
【发布时间】:2016-03-12 18:53:09
【问题描述】:

我正在尝试从用户特定时区的 UTC 基础创建日期,在本例中为“美国/洛杉矶”,使用 momentjs/momentjs 时区。但是,我没有得到预期的结果:

var tempDate = moment(1448841600000); //moment("2015-11-30"); //monday 11/30 in UTC
var adjustedStart = moment.tz(tempDate, "America/Los_Angeles");
adjustedStart.hour(9);
adjustedStart.minute(30);
console.log("adjustedStart in milliseconds:" + adjustedStart.valueOf());

控制台输出为 1448875800000,即 UTC/GMT 时间 11/30/15 上午 9:30,我预计 1448904600000,即太平洋海岸时间 11/30/15 上午 9:30。如何将此开始日期转换为用户时区中的正确时间?

【问题讨论】:

    标签: node.js timezone momentjs


    【解决方案1】:

    是的,1448841600000 就是你说的日期:

    moment(1448841600000).utc().format()
    // "2015-11-30T00:00:00+00:00"
    

    但那是太平洋时间的前一天

    moment(1448841600000).tz('America/Los_Angeles').format()
    // "2015-11-29T16:00:00-08:00"
    

    当你将它调整到太平洋时间 9:30 时,它是 29 日,而不是 30 日。

    moment(1448841600000).tz('America/Los_Angeles').hour(9).minute(30).format()
    // "2015-11-29T09:30:00-08:00"
    

    当你调用valueOf时,结果是:

    moment(1448841600000).tz('America/Los_Angeles').hour(9).minute(30).valueOf()
    // 1448818200000
    

    这是正确的值,但它与您提供的不同。然而,当我运行你的代码时,它确实是我得到的。

    Chrome 调试窗口的屏幕截图,包含您的确切代码:

    另外,您在 cmets 中写道:

    //moment("2015-11-30"); //monday 11/30 in UTC
    

    实际上,那将是 当地时间,而不是 UTC。如果你想要 UTC,你可以使用:

    moment.utc("2015-11-30")
    

    虽然我不清楚你是使用这个字符串输入还是数字时间戳。

    如果您要问的是您希望将 UTC 日期视为本地时间,然后应用任意本地时间 - 这是一个有点奇怪的操作,但它会是这样的:

    var tempDate = moment.utc(1448841600000);
    var adjustedStart = moment.tz([tempDate.year(), tempDate.month(), tempDate.date(), 9, 30],
                                                                      "America/Los_Angeles");
    console.log("adjustedStart in milliseconds:" + adjustedStart.valueOf());
    // adjustedStart in milliseconds:1448904600000
    

    这给出了您要求的值,但对我来说 - 这是一种期望有问题的气味。我会更仔细地研究需求和系统的其他部分。

    【讨论】:

    • 确实是有点奇怪的操作,但你最后回答的正是我要找的。​​span>
    【解决方案2】:

    来自http://momentjs.com/docs/

    moment#valueOf 仅输出自 Unix 纪元以来的毫秒数

    请务必注意,尽管上面的显示不同,但它们都是同一时刻。

    var a = moment();
    var b = moment.utc();
    a.format();  // 2013-02-04T10:35:24-08:00
    b.format();  // 2013-02-04T18:35:24+00:00
    a.valueOf(); // 1360002924000
    b.valueOf(); // 1360002924000
    

    所以它不应该因不同的时区而有所不同。

    您应该使用adjustedStart.format(); 来查看区别

    【讨论】:

    • 是的,根据您显示的区域设置显示更改。在这里,我希望以特定时区为起点的纪元时间作为起点,我实际上是在请求不同的时间点,而不是转换为该语言环境的原始时间点。
    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2018-11-25
    • 2013-06-10
    相关资源
    最近更新 更多