Javascript 向重复事件添加持续时间';s开始时间,以便它';s端总是在同一时间(即下午2点到4点)
我有一堆rrules(在中实现),它们为我提供了一系列事件开始时间(请参阅)Javascript 向重复事件添加持续时间';s开始时间,以便它';s端总是在同一时间(即下午2点到4点),javascript,date,datetime,Javascript,Date,Datetime,我有一堆rrules(在中实现),它们为我提供了一系列事件开始时间(请参阅)rulle.js或endtime。。。所以它可以告诉我第一百万次重复事件开始的确切日期,而不是它结束的确切日期。事实证明,我真的想知道一个活动何时结束,所以我必须发挥创意。在我看来,我有两个选择 DB端:存储一个rrule字符串+一个事件duration 客户端:从rrule字符串重建事件开始日期数组。只有开始时间是已知的,而结束时间将通过将持续时间作为偏移量添加到数组中的每个开始时间来计算 DB端:存储修改后的rrul
rulle.js
或endtime
。。。所以它可以告诉我第一百万次重复事件开始的确切日期,而不是它结束的确切日期。事实证明,我真的想知道一个活动何时结束,所以我必须发挥创意。在我看来,我有两个选择
duration
客户端:从rrule字符串重建事件开始日期数组。只有开始时间
是已知的,而结束时间
将通过将持续时间作为偏移量添加到数组中的每个开始时间来计算endtime
客户端:一个特殊的包装函数读取修改后的rrule字符串,并将其重建为两个日期数组;一个表示事件开始时间,另一个表示事件结束时间2014-11-02
中添加一天的分钟数时,你会得到2014-11-03T00:00:00.000Z
,但如果你直接在2014-11-02
中添加一天,你就可以得到2014-11-03T01:00:00.000Z
-休息一小时
那么,我最好还是选择第二种方案
现在让我们快进到未来任何一个周二下午6点。我的活动是否总是在周三凌晨2点结束(或者8小时的持续时间有时使我的活动在凌晨1点或3点结束)?我如何让它总是在凌晨2点结束
标准Javascript日期对象自动为您处理夏令时转换。即使你在夏令时前一天的下午6点为约会加上8小时,新的约会仍将在第二天凌晨2点结束
顺便说一句,我在中实现了持续时间支持,因为它支持标准javascriptDate
以及moment
/luxon
dates,所以您可以使用任意一个库测试具有持续时间的重复事件,并查看它们是否都产生相同的结果
这个例子可以是
从'@rschedule/rschedule'导入{Schedule};
从'@rschedule/StandardDateAdapter'导入{StandardDateAdapter};
//这个例子也适用于'moment'、'moment timezone'和'luxon'`
//(假设您导入了正确的日期适配器--请参阅rSchedule文档)
施工进度表=新进度表({
罗尔斯:[
{
开始日期:新日期(2019,9,10,18),
频率:“每日”,
持续时间:1000*60*60*8,
计数:30
}
],
dateAdapter:StandardDateAdapter,
});
schedule.events().toArray().forEach(适配器=>{
console.log(
{
开始:adapter.date.toLocalString(),
end:adapter.end.toLocaleString(),
}
)
})
事实上我想知道一件事什么时候结束
要了解此事件何时结束,您可以执行以下操作:
const iterator=schedule.executions({reverse:true})
const{end}=iterator.next().value
这个技巧只适用于实际有结束日期的事件(因此不是无限次出现的事件)。我在大约十年前写下了您所指的原始答案。七年后,我进行了编辑,将新日期(2014年10月2日)更改为新日期('2014-11-02')。我认为这会更容易阅读(因为您不必解释该版本的构造函数中的月份从0开始,而不是从1开始)。但是,以这种方式格式化会导致将其解析为UTC。我已经回去修复了这个问题(谢谢你指出) 要了解你问题中的“搔头”部分: 更重要的是,如果使用luxon或moment,当您在
2014-11-02
中添加一天的分钟数时,您会得到2014-11-03T00:00:00.000Z
时间戳末尾的Z
表示它是UTC,UTC不遵守夏令时。因此,如果您从2014-11-02T00:00:00.000Z
开始,再加上24小时,您将得到2014-11-03T00:00:00.000Z
。当您添加小时/分/秒时,就不必担心夏令时了
但是如果你直接在2014-11-02
上加上一天,你会得到2014-11-03T01:00:00.000Z
——休息一小时
在这种情况下,您是从2014-11-02T00:00:00.000Z
开始的,但是当您告诉图书馆增加一天,并且您没有指定时区时,图书馆假设您处于loca中
function addMinutes(date, minutes) {
return new Date(date.getTime() + minutes*60000);
}
addMinutes(new Date('2014-11-02'), 60*24) //In USA, prints 11pm on Nov 2, not 12am Nov 3!