如何使用时移生成重复 rschedule 持续时间
How to produce recurrence rschedule durations with timeshifts
我正在使用 rSchedule 生成工作时间 intervals.But 时区被忽略。我怎样才能实现它?
输入的是一天中的工作时间间隔,时区如下。
const input = {
workingHours:[{start:9, end:12}, {start:13, end:18}],
timeZone:'Europe/Berlin'
};
使用以下代码,我希望生成一年中日光变化的时间间隔。但是,生成的输出忽略了我提供的时区。
import { Schedule } from "@rschedule/core/generators";
import '@rschedule/moment-tz-date-adapter/setup';
import moment from 'moment-timezone';
const schedule = new Schedule({
rrules: [
{
frequency: "MONTHLY",//frequency: "WEEKLY",
//byDayOfWeek: ["MO", 'TU', 'WE', 'TH', 'FR'],
duration:1000 * 60 * 60 * 3,//input.workingHours[0].end-input.workingHours[0].start,
byHourOfDay:[12],//input.workingHours[0].end
timezone:'Europe/Berlin',//input.timeZone,
start: moment(Date.UTC(2019, 0, 1)),
end: moment(Date.UTC(2020, 0, 0))
}
]
});
schedule.occurrences().toArray().forEach(adapter => {
console.log(
{
start: adapter.date.toISOString(),
end: adapter.end.toISOString(),
}
)
})
忽略时区的输出:
{ start: '2019-01-01T09:00:00.000Z', end: '2019-01-01T12:00:00.000Z' }
{ start: '2019-02-01T09:00:00.000Z', end: '2019-02-01T12:00:00.000Z' }
{ start: '2019-03-01T09:00:00.000Z', end: '2019-03-01T12:00:00.000Z' }
{ start: '2019-04-01T09:00:00.000Z', end: '2019-04-01T12:00:00.000Z' }
{ start: '2019-05-01T09:00:00.000Z', end: '2019-05-01T12:00:00.000Z' }
{ start: '2019-06-01T09:00:00.000Z', end: '2019-06-01T12:00:00.000Z' }
{ start: '2019-07-01T09:00:00.000Z', end: '2019-07-01T12:00:00.000Z' }
{ start: '2019-08-01T09:00:00.000Z', end: '2019-08-01T12:00:00.000Z' }
{ start: '2019-09-01T09:00:00.000Z', end: '2019-09-01T12:00:00.000Z' }
{ start: '2019-10-01T09:00:00.000Z', end: '2019-10-01T12:00:00.000Z' }
{ start: '2019-11-01T09:00:00.000Z', end: '2019-11-01T12:00:00.000Z' }
{ start: '2019-12-01T09:00:00.000Z', end: '2019-12-01T12:00:00.000Z' }
预期输出:
{ start: '2019-01-01T11:00:00.000Z', end: '2019-01-01T14:00:00.000Z' },
{ start: '2019-02-01T11:00:00.000Z', end: '2019-02-01T14:00:00.000Z' },
{ start: '2019-03-01T11:00:00.000Z', end: '2019-03-01T14:00:00.000Z' },
{ start: '2019-04-01T10:00:00.000Z', end: '2019-04-01T13:00:00.000Z' },
{ start: '2019-05-01T10:00:00.000Z', end: '2019-05-01T13:00:00.000Z' },
{ start: '2019-06-01T10:00:00.000Z', end: '2019-06-01T13:00:00.000Z' },
{ start: '2019-07-01T10:00:00.000Z', end: '2019-07-01T13:00:00.000Z' },
{ start: '2019-08-01T10:00:00.000Z', end: '2019-08-01T13:00:00.000Z' },
{ start: '2019-09-01T10:00:00.000Z', end: '2019-09-01T13:00:00.000Z' },
{ start: '2019-10-01T10:00:00.000Z', end: '2019-10-01T13:00:00.000Z' },
{ start: '2019-11-01T11:00:00.000Z', end: '2019-11-01T14:00:00.000Z' },
{ start: '2019-12-01T11:00:00.000Z', end: '2019-12-01T14:00:00.000Z' }
因为我不熟悉这些时区(并且不知道 "expected output" 应该在哪个时区),所以您不太清楚您期望发生什么。但正如@JorgeFuentesGonzález 在评论中指出的那样,问题是 可能 您没有在正确的时区提供 start
日期时间。
正如 rSchedule source code 中所指出的(它应该作为工具提示方便地显示在 VSCode--edit 等编辑器中我已经继续并在 rSchedule 文档中阐明了这一点 ),Rule
对象的 timezone
配置选项不会更改规则所在的时区,它会更改时区这个规则在displayed中。这个区别对于rSchedule的内部功能很重要,但是我可以看出在这种情况下是不清楚的。
所以你的规则是在你的本地时区生成事件(因为 start: moment(Date.UTC(2019, 0, 1))
生成本地 moment
),然后这些事件在输出之前被转换到 'Europe/Berlin'
时区.除了等待!事实并非如此。此 Rule
是 Schedule
的一部分,因此它是计划的时区,它决定了事件的输出时区。该时间表似乎没有时区(因此它在当地时区)。所以我认为规则是在当地时区,输出日期是在当地时区。
- 注意:使用
toISOString()
的控制台日志记录可能会混淆这样一个事实,即您的输出日期是在您当地的时区,而不是您期望的任何时区。
根据您要完成的目标,我建议如下:
import { Schedule } from "@rschedule/core/generators";
import '@rschedule/moment-tz-date-adapter/setup';
import moment from 'moment-timezone';
const schedule = new Schedule({
rrules: [
{
frequency: "MONTHLY",//frequency: "WEEKLY",
duration:1000 * 60 * 60 * 3,//input.workingHours[0].end-input.workingHours[0].start,
byHourOfDay:[12],//input.workingHours[0].end
start: moment.tz(Date.UTC(2019, 0, 1), 'Europe/Berlin'),
end: moment.tz(Date.UTC(2020, 0, 0), 'Europe/Berlin')
}
],
timezone:'Europe/Berlin'
});
如果您仍然没有看到预期的效果,请告诉我。
我正在使用 rSchedule 生成工作时间 intervals.But 时区被忽略。我怎样才能实现它?
输入的是一天中的工作时间间隔,时区如下。
const input = {
workingHours:[{start:9, end:12}, {start:13, end:18}],
timeZone:'Europe/Berlin'
};
使用以下代码,我希望生成一年中日光变化的时间间隔。但是,生成的输出忽略了我提供的时区。
import { Schedule } from "@rschedule/core/generators";
import '@rschedule/moment-tz-date-adapter/setup';
import moment from 'moment-timezone';
const schedule = new Schedule({
rrules: [
{
frequency: "MONTHLY",//frequency: "WEEKLY",
//byDayOfWeek: ["MO", 'TU', 'WE', 'TH', 'FR'],
duration:1000 * 60 * 60 * 3,//input.workingHours[0].end-input.workingHours[0].start,
byHourOfDay:[12],//input.workingHours[0].end
timezone:'Europe/Berlin',//input.timeZone,
start: moment(Date.UTC(2019, 0, 1)),
end: moment(Date.UTC(2020, 0, 0))
}
]
});
schedule.occurrences().toArray().forEach(adapter => {
console.log(
{
start: adapter.date.toISOString(),
end: adapter.end.toISOString(),
}
)
})
忽略时区的输出:
{ start: '2019-01-01T09:00:00.000Z', end: '2019-01-01T12:00:00.000Z' }
{ start: '2019-02-01T09:00:00.000Z', end: '2019-02-01T12:00:00.000Z' }
{ start: '2019-03-01T09:00:00.000Z', end: '2019-03-01T12:00:00.000Z' }
{ start: '2019-04-01T09:00:00.000Z', end: '2019-04-01T12:00:00.000Z' }
{ start: '2019-05-01T09:00:00.000Z', end: '2019-05-01T12:00:00.000Z' }
{ start: '2019-06-01T09:00:00.000Z', end: '2019-06-01T12:00:00.000Z' }
{ start: '2019-07-01T09:00:00.000Z', end: '2019-07-01T12:00:00.000Z' }
{ start: '2019-08-01T09:00:00.000Z', end: '2019-08-01T12:00:00.000Z' }
{ start: '2019-09-01T09:00:00.000Z', end: '2019-09-01T12:00:00.000Z' }
{ start: '2019-10-01T09:00:00.000Z', end: '2019-10-01T12:00:00.000Z' }
{ start: '2019-11-01T09:00:00.000Z', end: '2019-11-01T12:00:00.000Z' }
{ start: '2019-12-01T09:00:00.000Z', end: '2019-12-01T12:00:00.000Z' }
预期输出:
{ start: '2019-01-01T11:00:00.000Z', end: '2019-01-01T14:00:00.000Z' },
{ start: '2019-02-01T11:00:00.000Z', end: '2019-02-01T14:00:00.000Z' },
{ start: '2019-03-01T11:00:00.000Z', end: '2019-03-01T14:00:00.000Z' },
{ start: '2019-04-01T10:00:00.000Z', end: '2019-04-01T13:00:00.000Z' },
{ start: '2019-05-01T10:00:00.000Z', end: '2019-05-01T13:00:00.000Z' },
{ start: '2019-06-01T10:00:00.000Z', end: '2019-06-01T13:00:00.000Z' },
{ start: '2019-07-01T10:00:00.000Z', end: '2019-07-01T13:00:00.000Z' },
{ start: '2019-08-01T10:00:00.000Z', end: '2019-08-01T13:00:00.000Z' },
{ start: '2019-09-01T10:00:00.000Z', end: '2019-09-01T13:00:00.000Z' },
{ start: '2019-10-01T10:00:00.000Z', end: '2019-10-01T13:00:00.000Z' },
{ start: '2019-11-01T11:00:00.000Z', end: '2019-11-01T14:00:00.000Z' },
{ start: '2019-12-01T11:00:00.000Z', end: '2019-12-01T14:00:00.000Z' }
因为我不熟悉这些时区(并且不知道 "expected output" 应该在哪个时区),所以您不太清楚您期望发生什么。但正如@JorgeFuentesGonzález 在评论中指出的那样,问题是 可能 您没有在正确的时区提供 start
日期时间。
正如 rSchedule source code 中所指出的(它应该作为工具提示方便地显示在 VSCode--edit 等编辑器中我已经继续并在 rSchedule 文档中阐明了这一点 ),Rule
对象的 timezone
配置选项不会更改规则所在的时区,它会更改时区这个规则在displayed中。这个区别对于rSchedule的内部功能很重要,但是我可以看出在这种情况下是不清楚的。
所以你的规则是在你的本地时区生成事件(因为 start: moment(Date.UTC(2019, 0, 1))
生成本地 moment
),然后这些事件在输出之前被转换到 'Europe/Berlin'
时区.除了等待!事实并非如此。此 Rule
是 Schedule
的一部分,因此它是计划的时区,它决定了事件的输出时区。该时间表似乎没有时区(因此它在当地时区)。所以我认为规则是在当地时区,输出日期是在当地时区。
- 注意:使用
toISOString()
的控制台日志记录可能会混淆这样一个事实,即您的输出日期是在您当地的时区,而不是您期望的任何时区。
根据您要完成的目标,我建议如下:
import { Schedule } from "@rschedule/core/generators";
import '@rschedule/moment-tz-date-adapter/setup';
import moment from 'moment-timezone';
const schedule = new Schedule({
rrules: [
{
frequency: "MONTHLY",//frequency: "WEEKLY",
duration:1000 * 60 * 60 * 3,//input.workingHours[0].end-input.workingHours[0].start,
byHourOfDay:[12],//input.workingHours[0].end
start: moment.tz(Date.UTC(2019, 0, 1), 'Europe/Berlin'),
end: moment.tz(Date.UTC(2020, 0, 0), 'Europe/Berlin')
}
],
timezone:'Europe/Berlin'
});
如果您仍然没有看到预期的效果,请告诉我。