【发布时间】:2023-03-05 16:06:01
【问题描述】:
我正在使用这个例子来创建一个角度日历。但我今天意识到,当 DST 结束时,日期会重复,然后从那时起日子就差一天了。
看看堆栈闪电战。 11 月 7 日重复。 stackblitz link to calendar
这是生成日历日的代码。我该如何调整,以免 DST 搞砸一切?
private getCalendarDays(date = new Date) {
var startDate;
startDate = this.getCalendarStartDay(date).getTime();
const calendarStartTime = startDate;
return this.range(0, 41)
.map(num => new Date(calendarStartTime + DAY_MS * num));
}
private getCalendarStartDay(date = new Date) {
const [year, month] = [date.getFullYear(), date.getMonth()];
const firstDayOfMonth = new Date(year, month, 1).getTime();
return this.range(1,7)
.map(num => new Date(firstDayOfMonth - DAY_MS * num))
.find(dt => dt.getDay() === 0)
}
private range(start, end, length = end - start + 1) {
return Array.from({ length }, (_, i) => start + i)
}
【问题讨论】:
-
我研究了 stackblitz,它运行良好
-
怎么了?!
-
@skyBlue 在 StackBlitz 中,我看到数字 7 出现在周日和周一
-
这有点通用,但我的冲动是循环一个整数列表来创建月份显示。获取当月的第一天找到第一天;加 1 个月,然后减去 1 天得到该月的最后一天。我不确定为什么需要时间进入这个等式来创建显示。正如您所了解的那样,您通过进行 ms 计算来获取日期列表这一事实是问题所在。由于夏令时,并非每天都有相同的毫秒数。
-
使用每天的毫秒数添加天数(我假设 DAY_MS 表示)将在观察夏令时的地方导致错误,因为并非所有天都是 24 小时长。见How can I add 1 day to current date?
标签: javascript angular date calendar dst