如何从现在到特定工作日找到最近的未来日期?
How to find nearest future date from now with specific weekday?
我有一个约会管理方案,其中我有一个 availableWeekDays
人员的字段列表,他们可以在工作日进行预订。例如,如果它们在星期一可用,我在 availableWeekDays 列表中的值为 1.
我使用 DateTime.now()
.
将 currentDate 存储在 DateTime
变量中
我要做的是首先查看今天的工作日是否与 person 的 availableWeekDay 匹配。如果是,那么 bookingDate 是有效的,否则我必须在工作日寻找最近的未来日期。我尝试了以下解决方案,但它可以工作一个星期,因为我使用的是第一个索引。
void main() {
DateTime bookingDate = DateTime.now();
int availableWeekDays = [1,4,7];
getDate(){
if(bookingDate.weekday == availableWeekDays[0]){
print("Available on $bookingDate ");
} else {
bookingDate = bookingDate.add(Duration(days: 1));
getDate();
}
}
getDate();
}
我想在列表中的所有工作日中找到最近的未来日期。
我忘了将结果重新分配给变量。这现在有效。
void main() {
DateTime bookingDate = DateTime.now();
int availableWeekDay = 1;
getDate(){
if(bookingDate.weekday == availableWeekDay){
print("Available on $bookingDate ");
} else {
bookingDate = bookingDate.add(Duration(days: 1));
getDate();
}
}
getDate();
}
更有效的解决方案是:
DateTime getDate() {
var currentDay = bookingDate.weekday;
var offset = (availableWeekDay - currentDay).remainder(7);
return offset == 0 ? bookingDate : bookingDate.add(Duration(days: offset));
}
请注意,如果 bookingDate
的时间接近午夜,则向日期添加“天”(24 小时的倍数)可能 运行 会导致夏令时问题。
DateTime findNearestWeekday(List<int> availableWeekdays) {
assert(availableWeekdays.isNotEmpty);
var date = DateTime.now();
final weekday = date.weekday;
for (var num in availableWeekdays) {
if (num == date.weekday) {
return date;
} else if (date.weekday < num) {
return date.add(Duration(days: num - weekday));
}
}
/// I have assumed that you will always have a sorted list of available
/// weekdays, in case you do not have a sorted list, either you can sort
/// the list first or just use this line (instead of the last one),
///
/// ```dart
/// import 'dart:math'; /// Add on Top of file.
///
/// return date.add(Duration(days: 7 - weekday + availableWeekdays.reduce(min)))
/// ```
///
/// I will prefer to pre sort the array before storing it somewhere,
/// because it will add an additional dependency dart:math
return date.add(Duration(days: 7 - weekday + availableWeekdays[0]));
}
我有一个约会管理方案,其中我有一个 availableWeekDays
人员的字段列表,他们可以在工作日进行预订。例如,如果它们在星期一可用,我在 availableWeekDays 列表中的值为 1.
我使用 DateTime.now()
.
DateTime
变量中
我要做的是首先查看今天的工作日是否与 person 的 availableWeekDay 匹配。如果是,那么 bookingDate 是有效的,否则我必须在工作日寻找最近的未来日期。我尝试了以下解决方案,但它可以工作一个星期,因为我使用的是第一个索引。
void main() {
DateTime bookingDate = DateTime.now();
int availableWeekDays = [1,4,7];
getDate(){
if(bookingDate.weekday == availableWeekDays[0]){
print("Available on $bookingDate ");
} else {
bookingDate = bookingDate.add(Duration(days: 1));
getDate();
}
}
getDate();
}
我想在列表中的所有工作日中找到最近的未来日期。
我忘了将结果重新分配给变量。这现在有效。
void main() {
DateTime bookingDate = DateTime.now();
int availableWeekDay = 1;
getDate(){
if(bookingDate.weekday == availableWeekDay){
print("Available on $bookingDate ");
} else {
bookingDate = bookingDate.add(Duration(days: 1));
getDate();
}
}
getDate();
}
更有效的解决方案是:
DateTime getDate() {
var currentDay = bookingDate.weekday;
var offset = (availableWeekDay - currentDay).remainder(7);
return offset == 0 ? bookingDate : bookingDate.add(Duration(days: offset));
}
请注意,如果 bookingDate
的时间接近午夜,则向日期添加“天”(24 小时的倍数)可能 运行 会导致夏令时问题。
DateTime findNearestWeekday(List<int> availableWeekdays) {
assert(availableWeekdays.isNotEmpty);
var date = DateTime.now();
final weekday = date.weekday;
for (var num in availableWeekdays) {
if (num == date.weekday) {
return date;
} else if (date.weekday < num) {
return date.add(Duration(days: num - weekday));
}
}
/// I have assumed that you will always have a sorted list of available
/// weekdays, in case you do not have a sorted list, either you can sort
/// the list first or just use this line (instead of the last one),
///
/// ```dart
/// import 'dart:math'; /// Add on Top of file.
///
/// return date.add(Duration(days: 7 - weekday + availableWeekdays.reduce(min)))
/// ```
///
/// I will prefer to pre sort the array before storing it somewhere,
/// because it will add an additional dependency dart:math
return date.add(Duration(days: 7 - weekday + availableWeekdays[0]));
}