【发布时间】:2019-10-08 13:23:39
【问题描述】:
我怎样才能在飞镖中获得一周的开始或结束?一个例子是如果三天前是星期一,今天是星期三,我如何使用飞镖找到一周的开始,即星期一
【问题讨论】:
我怎样才能在飞镖中获得一周的开始或结束?一个例子是如果三天前是星期一,今天是星期三,我如何使用飞镖找到一周的开始,即星期一
【问题讨论】:
Dart DateTimes 有一个 weekday 吸气剂,周一为 1,周日为 7。使用它,我会这样做:
DateTime mostRecentSunday(DateTime date) =>
DateTime(date.year, date.month, date.day - date.weekday % 7);
获取最近的星期日(如果一周从星期日开始,则为当前周的开始),并且
DateTime mostRecentMonday(DateTime date) =>
DateTime(date.year, date.month, date.day - (date.weekday - 1));
最近的星期一(如果该周从星期一开始,则为当前周的开始)。
你可以概括为
/// The [weekday] may be 0 for Sunday, 1 for Monday, etc. up to 7 for Sunday.
DateTime mostRecentWeekday(DateTime date, int weekday) =>
DateTime(date.year, date.month, date.day - (date.weekday - weekday) % 7);
如果您要将结果用作日历日期,我会使用DateTime.utc 作为构造函数。 (始终使用 UTC 作为日历日期,然后您可以安全地对它们进行基于日期的算术)。
我什至会考虑在任何情况下使用DateTime.utc,因为它避免了从午夜开始的夏令时的任何潜在问题(很少见,但对于时区,即使是不太可能的事情也往往会发生在某个时候发生在某个地方)。
【讨论】:
DateTime.weekday 是 documented 作为返回 1 到 7,所以 %7 不应该有所作为。您在哪里发现问题?
您可以使用 https://api.dart.dev/stable/2.5.1/dart-core/DateTime/weekday.html 从 DateTime 中获取工作日,并从您的日期中添加/减去此数字:
void main() {
final date = DateTime.parse('2019-10-08 15:43:03.887');
print('Date: $date');
print('Start of week: ${getDate(date.subtract(Duration(days: date.weekday - 1)))}');
print('End of week: ${getDate(date.add(Duration(days: DateTime.daysPerWeek - date.weekday)))}');
}
DateTime getDate(DateTime d) => DateTime(d.year, d.month, d.day);
更新
请阅读 lrn 的答案并点赞。他对这件事的了解比我多得多。 :)
【讨论】:
DateTime(date.year, date.month, date.day - date.weekday % 7) 来获取最近的星期日的开始,并使用DateTime(date.year, date.month, date.day - (date.weekday - 1)) 来获取最近的星期一。如果您打算将它们用作日历日期,我会使用 DateTime.utc 作为构造函数。 (始终使用 UTC 作为日历日期,然后您可以安全地对其进行基于日期的算术运算)。
Dart/Flutter – 如何找到一周的第一个日期和最后一个日期
1.查找一周的第一个日期
/// Find the first date of the week which contains the provided date.
DateTime findFirstDateOfTheWeek(DateTime dateTime) {
return dateTime.subtract(Duration(days: dateTime.weekday - 1));
}
2.查找一周的最后一天
/// Find last date of the week which contains provided date.
DateTime findLastDateOfTheWeek(DateTime dateTime) {
return dateTime.add(Duration(days: DateTime.daysPerWeek - dateTime.weekday));
}
测试
void main() {
// Find first date and last date of THIS WEEK
DateTime today = DateTime.now();
print(findFirstDateOfTheWeek(today));
print(findLastDateOfTheWeek(today));
// Find first date and last date of any provided date
DateTime date = DateTime.parse('2020-11-24');
print(findFirstDateOfTheWeek(date));
print(findLastDateOfTheWeek(date));
}
// Output
2020-11-23 06:54:42.865446
2020-11-29 06:54:42.865446
2020-11-23 00:00:00.000
2020-11-29 00:00:00.000
【讨论】:
您执行此操作的方式可能取决于您的应用的本地化是什么。如果您想将星期日视为一周的开始,您可以这样做:
DateTime now = DateTime.now();
int currentDay = now.weekday;
DateTime firstDayOfWeek = now.subtract(Duration(days: currentDay));
如果您将星期一视为开始,请执行以下操作:
DateTime now = DateTime.now();
int currentDay = now.weekday;
DateTime firstDayOfWeek = now.subtract(Duration(days: currentDay - 1));
如果你在 Flutter 中使用 Dart,你可以使用 MaterialLocalizations 类来获取一周第一天的索引(0 = 星期日,6 = 星期六)。这应该可以帮助您决定应该使用上面的哪种方法。
firstDayOfWeekIndex 属性的示例是一个很好的参考:
var localizations = MaterialLocalizations.of(context);
// The name of the first day of week for the current locale.
var firstDayOfWeek = localizations.narrowWeekdays[localizations.firstDayOfWeekIndex];
MaterialLocalizations 类带有大量用于格式化和显示日期时间的内置方法。
日期时间:2021-01-26 11:21:05.429320
如果这些都不符合您的需求,您还可以使用DateFormat 类来指定 DateTime 的显示方式。请务必注意,DateFormat 类对日期的索引方式不同,其中 1 = 星期一和 7 = 星期日。
DateFormat.yMMMd().format(new DateTime.now()) // Jan 26, 2021
DateFormat(DateFormat.ABBR_MONTH_DAY).format(now) // Jan 26
DateFormat(DateFormat.WEEKDAY).format(now) // Tuesday
【讨论】:
以上方法都不适合我,但@JoeMuller 提供了一条关于材料本地化的有趣信息,这让我发现,对于我想要的,sunday in date.weekday 应该是 0 需要一段时间才能弄清楚非常感谢 joe 和 @julemand101 我有这个从星期日开始到星期六结束的英国日历
void main() {
final date = DateTime.parse('2021-08-01');
print('Date: $date');
final weekDay = date.weekday == 7 ? 0 : date.weekday;
print('Start of week: ${getDate(date.subtract(Duration(days: weekDay)))}');
print('End of week: ${getDate(date.add(Duration(days: DateTime.daysPerWeek - weekDay - 1)))}');
}
DateTime getDate(DateTime d) => DateTime(d.year, d.month, d.day);
【讨论】: