如何在运行node.js的服务器上使用时刻js和时区偏移量从rrule字符串将日期转换为UTC格式?

时间:2015-11-25 18:13:27

标签: node.js momentjs timezone-offset rrule

在浏览器中我制作了一个生成一个rrule字符串的小部件:

var rruleString = "FREQ=WEEKLY;WKST=SU;BYDAY=MO,WE,FR;BYHOUR=8;BYMINUTE=30;BYSECOND=0"

此外,我通过此功能从浏览器获得时区偏移:

//This is 300 for me    
var timezoneOffSet = (new Date()).getTimezoneOffset(); 

我将它们发送到运行node.js的服务器。在服务器上,我想使用rrule和时区偏移量生成UTC格式的日期列表。以下是我现在的表现:

var rruleOptions = RRule.parseString(rruleString);

rruleOptions.dtstart = new Date();
rruleOptions.until = new Date();
rruleOptions.until.setMonth(options.until.getMonth() + 4);

var rule = new RRule(rruleOptions);

var dates = rule.all();

//Convert the dates into moment.js objects
momentDates = dates.map(function(date){

    //This is where I think the problem is because I think moment is
    //using the server's timezone
    return moment(date).utcOffset(timezoneOffSet*-1);      
});

//Convert the moment object array into an array of strings
var dateStringArray = momentDates.map(function(date){
    //Doesn't work returns 2015-11-27T08:30:00.00Z
    //return date.toISOString(); 

    //Doesn't work returns 2015-11-27T08:30:00.00Z
    //return date.utc().toISOString(); 

    //This works returns 2015-11-27T03:30:00.00Z for one of the objects
    return date.format('YYYY-MM-DDThh:mm')+":00.00Z";  
});

似乎我应该能够使用那些无法在UTC中获取日期的功能,但由于某种原因,它们无法正常工作。我想我错过了一些关于如何使用正确方法来做到这一点的方法。谁能看到我做错了什么?

2 个答案:

答案 0 :(得分:0)

注意:如果将Date作为具有多个参数的构造函数调用,则指定的参数表示本地时间。如果需要UTC,请使用具有相同参数的新日期(Date.UTC(...))。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

您可能正在使用map()。但是在没有设置密钥的情况下传递函数。你也没有传递数组

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

答案 1 :(得分:0)

我现在想出来了。

当rrule生成日期(来自rule.all())时,日期已经处于UTC模式(如果我错了,有人会纠正我,但是使用上面的例子我做一个控制台时得到的日期之一.log是2015年12月7日星期一08:30:00 GMT + 0000(UTC),这似乎表明它是在UTC时间)。

所以这个:

//Convert the dates into moment.js objects
momentDates = dates.map(function(date){

    //This is where I think the problem is because I think moment is
    //using the server's timezone
    return moment(date).utcOffset(timezoneOffSet*-1);      
});

变成这样:

momentDates = dates.map(function(date){
    return moment(date).add(timezoneOffSet, 'minutes');      
});

添加偏移量从客户端角度而不是服务器获取UTC时间的日期。现在我也意识到我以前走错路了;我试图减去而​​不是添加偏移量。

最后一点:

//Convert the moment object array into an array of strings
var dateStringArray = momentDates.map(function(date){
    //Doesn't work returns 2015-11-27T08:30:00.00Z
    //return date.toISOString(); 

    //Doesn't work returns 2015-11-27T08:30:00.00Z
    //return date.utc().toISOString(); 

    //This works returns 2015-11-27T03:30:00.00Z for one of the objects
    return date.format('YYYY-MM-DDThh:mm')+":00.00Z";  
});

现在可以变成这个:

var dateStringArray = momentDates.map(function(date){
    return date.toISOString();   
});

使用上面的日期,返回此字符串:

2015-12-07T13:30:00.000Z

哪个是正确的UTC时间!