在浏览器中我制作了一个生成一个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中获取日期的功能,但由于某种原因,它们无法正常工作。我想我错过了一些关于如何使用正确方法来做到这一点的方法。谁能看到我做错了什么?
答案 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时间!