如何使用 moment js 和服务器 运行 node.js 上的时区偏移将日期从 rrule 字符串转换为 UTC 格式?
How do I convert date into UTC format from rrule string using moment js and a timezone offset on a server running node.js?
在浏览器上,我制作了一个生成规则字符串的小部件:
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。在服务器上,我想使用规则和时区偏移来生成 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 日期,但由于某些原因它们不起作用。我想我遗漏了一些关于如何以正确的方式利用时刻来做到这一点的东西。谁能看出我做错了什么?
注意:当 Date 作为具有多个参数的构造函数调用时,指定的参数表示本地时间。如果需要 UTC,请使用具有相同参数的 new Date(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
我现在想通了。
当 rrule 生成日期(来自 rule.all())时,日期已经处于 UTC 模式(如果我错了,请有人纠正我,但使用上面的示例,我从中得到的日期之一a console.log is Mon Dec 07 2015 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();
});
使用上面的日期,即 returns 这个字符串:
2015-12-07T13:30:00.000Z
哪个是正确的 UTC 时间!
在浏览器上,我制作了一个生成规则字符串的小部件:
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。在服务器上,我想使用规则和时区偏移来生成 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 日期,但由于某些原因它们不起作用。我想我遗漏了一些关于如何以正确的方式利用时刻来做到这一点的东西。谁能看出我做错了什么?
注意:当 Date 作为具有多个参数的构造函数调用时,指定的参数表示本地时间。如果需要 UTC,请使用具有相同参数的 new Date(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
我现在想通了。
当 rrule 生成日期(来自 rule.all())时,日期已经处于 UTC 模式(如果我错了,请有人纠正我,但使用上面的示例,我从中得到的日期之一a console.log is Mon Dec 07 2015 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();
});
使用上面的日期,即 returns 这个字符串:
2015-12-07T13:30:00.000Z
哪个是正确的 UTC 时间!