给定一个日期,假设它是星期一,我希望如果我加上7天,我将得到一个新的星期一。
有时候是这样,在某些情况下,它增加了一点,我得到了一个星期天。我可以继续增加7天,我得到星期天,直到我得到一个新的星期一回来。
我怎样才能做一个精确的循环,返回我在一周的同一天。
这里我将代码保留在Dart中。链接到dartpad
void main() {
var date = DateTime(2020, 10, 20);
var weekday = date.weekday;
var endDate = DateTime(2021, 4, 8);
while (endDate.difference(date).inDays > 0) {
assert(date.weekday == weekday);
print('$date ${date.weekday} $weekday');
date = date.add(Duration(days: 7));
}
print('end');
}
结果是
2020-10-20 00:00:00.000 2 2
2020-10-26 23:00:00.000 1 2
2020-11-02 23:00:00.000 1 2
2020-11-09 23:00:00.000 1 2
2020-11-16 23:00:00.000 1 2
2020-11-23 23:00:00.000 1 2
2020-11-30 23:00:00.000 1 2
2020-12-07 23:00:00.000 1 2
2020-12-14 23:00:00.000 1 2
2020-12-21 23:00:00.000 1 2
2020-12-28 23:00:00.000 1 2
2021-01-04 23:00:00.000 1 2
2021-01-11 23:00:00.000 1 2
2021-01-18 23:00:00.000 1 2
2021-01-25 23:00:00.000 1 2
2021-02-01 23:00:00.000 1 2
2021-02-08 23:00:00.000 1 2
2021-02-15 23:00:00.000 1 2
2021-02-22 23:00:00.000 1 2
2021-03-01 23:00:00.000 1 2
2021-03-08 23:00:00.000 1 2
2021-03-15 23:00:00.000 1 2
2021-03-22 23:00:00.000 1 2
2021-03-30 00:00:00.000 2 2
2021-04-06 00:00:00.000 2 2
end
1条答案
按热度按时间w6lpcovy1#
正如评论中所解释的,
Duration(days: 7)
意味着7 * 24小时。(Duration
在内部只是一个表示微秒数的整数。)如果您的本地时区由于夏令时而更改,然后加上“1天”(24小时)本地DateTime
对象,如果夏令时开始或结束时间在以下时间段内,则会导致DateTime
对象的本地时间与原始时间不同那个时间间隔。如
DateTime
documentation中所述:不同时区的两个日期之间的差异仅仅是两个时间点之间的纳秒数。它不考虑日历日。这意味着,如果其间有夏令时变化,当地时间的两个午夜之间的差异可能小于24小时乘以它们之间的天数。如果使用澳大利亚当地时间计算上述差异,差异为7415天零23小时,这仅是由
inDays
报告的7415整天。如果只想添加日历日而不影响时间,该怎么办?可以使用UTC而不是本地时区,但如果要向用户显示时间,这可能不太方便。或者,可以提供自己的函数来添加日历日的数量,并从原始时间复制时间:
然后用
date.addCalendarDays(7)
替换date.add(Duration(days: 7))
。以上代码可从
package:basics
获得。