gpt4 book ai didi

javascript - 将持续时间添加到重复事件的开始时间,以便它的结束始终是同一时间(即下午 2 点到下午 4 点)

转载 作者:行者123 更新时间:2023-11-30 11:03:29 25 4
gpt4 key购买 nike

我有一堆规则(在 rrule.js 中实现),它们为我提供了一组事件开始时间(参见 demo)。 rrule.js doesn't actually provide the concept of an event durationendtime ... 所以它可以告诉我重复事件第 100 万次出现的确切日期,但不能告诉我它何时结束。结果我真的想知道事件什么时候结束,所以我必须发挥创意。据我所知,我有两个选择

  1. 数据库端:存储规则字符串 + 事件 duration .

    客户端:根据规则字符串重构事件开始日期数组。只有start times会知道并且end times将通过将持续时间作为偏移量添加到数组中的每个开始时间来计算。

  2. 数据库端:存储修改后的规则字符串,它编码 endtime .

    客户端:一个特殊的包装函数读取修改后的规则字符串并将其重构为两个日期数组;一个代表事件开始时间,另一个代表结束时间。

选项 1 似乎更容易,但我怀疑它会遇到夏令时问题。例如,假设我有一个事件是每周二下午 6 点到周三凌晨 2 点。在那种情况下,我会在我的数据库中存储 8 小时的持续时间以及该字符串化规则。现在让我们快进到 future 任何一个星期二下午 6 点。我的事件是否总是在周三凌晨 2 点结束(或者 8 小时的持续时间有时会使我的事件在凌晨 1 点或凌晨 3 点结束)? 如何让它始终在凌晨 2 点结束?

...如果您知道答案,请停止阅读此处。

我看到其他人如何处理持续时间偏移

根据 Kip 在 How to add 30 minutes to a JavaScript Date object? 中的说法偏移日期时间的聪明方法是使用像 moment.js 这样的奇特库。

他通过展示使用非花哨的日期时间库是多么容易出错(展示了天真的分钟偏移函数如何由于夏令时而失败)来强调这一点

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!

但是我遇到了一些奇怪的事情。上面的函数应该输出 11pm on Nov 2 - 这是错误的答案,即它应该因为夏令时而失败。当我运行它时,它实际上输出了正确的时间 12am on Nov 3 (注意:我在芝加哥/中部时间)。

当我将他的原始函数的输出与 moment.js 和 luxon.js 的输出进行比较时,我得到了与您在这个 observable notebook 中看到的相同的答案。 .

抓耳挠腮

此外,如果使用 luxon 或 moment,当您将一天的分钟数添加到 2014-11-02 时你得到 2014-11-03T00:00:00.000Z但是如果你直接在2014-11-02上加一天你得到 2014-11-03T01:00:00.000Z - 休息一个小时。

那么我最好选择选项 2 吗?

最佳答案

Now let's fast forward to any 6pm Tuesday in the future. Does my event always end on Wednesday at 2am (or does that 8 hour duration sometimes make my event end at 1am or 3am)? How do I get it to always end at 2am?

标准的 Javascript Date 对象会自动为您处理夏令时转换。即使您将夏令时前一天下午 6 点的日期增加 8 小时,新日期仍将在第二天凌晨 2 点结束。

顺便说一句,我在 rSchedule 中实现了持续时间支持由于它同时支持标准的 javascript Datemoment/luxon 日期,您可以使用任一库测试持续时间的重复事件并看到它们都产生相同的结果。

这个例子可以是seen on stackblitz .

import { Schedule } from '@rschedule/rschedule';
import { StandardDateAdapter } from '@rschedule/standard-date-adapter';

// This example will also work with `moment`, `moment-timezone`, and `luxon`
// (assuming you import the proper date adapter -- see rSchedule docs)

const schedule = new Schedule({
rrules: [
{
start: new Date(2019,9,10,18),
frequency: "DAILY",
duration: 1000 * 60 * 60 * 8,
count: 30
}
],
dateAdapter: StandardDateAdapter,
});

schedule.occurrences().toArray().forEach(adapter => {
console.log(
{
start: adapter.date.toLocaleString(),
end: adapter.end.toLocaleString(),
}
)
})

Turns out I actually want to know when an event ends

要了解此事件何时结束,您可以:

const iterator = schedule.occurrences({ reverse: true })

const { end } = iterator.next().value

此技巧仅适用于实际具有结束日期的事件(因此不适用于无限次发生的事件)。

关于javascript - 将持续时间添加到重复事件的开始时间,以便它的结束始终是同一时间(即下午 2 点到下午 4 点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56615246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com