时刻 - 时区解析给定的时区

时间:2016-08-01 14:17:50

标签: javascript node.js momentjs

使用moment-timezone

解析Date对象时遇到问题

问题

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

在示例中

time | timezone
11:00| US/Eastern

当REST调用到来时,我必须获取新的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;

}

尝试使用moment-timezone创建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包来设置日期和时间,并将它们视为给定的时区?

2 个答案:

答案 0 :(得分: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 :(得分:2)

所以问题在于

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');

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