【问题标题】:How to get start of or end of week in dart如何在飞镖中获得一周的开始或结束
【发布时间】:2019-10-08 13:23:39
【问题描述】:

我怎样才能在飞镖中获得一周的开始或结束?一个例子是如果三天前是星期一,今天是星期三,我如何使用飞镖找到一周的开始,即星期一

【问题讨论】:

标签: datetime dart


【解决方案1】:

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.weekdaydocumented 作为返回 1 到 7,所以 %7 不应该有所作为。您在哪里发现问题?
  • 是的,你是对的,我遵循代码的一致性,我注意到星期一不同,但正如你所说,它永远不会达到数字 7,无论如何,我删除了我的评论我不会混淆其他人。
【解决方案2】:

您可以使用 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 的答案并点赞。他对这件事的了解比我多得多。 :)

【讨论】:

  • 感谢它的工作,但我稍微调整了一下,使星期的开始和星期六的结束
  • 嗯,在丹麦,我们使用星期一作为一周的开始,所以这就是我使用它的原因。 :)
  • 而且在开始时,时间应该从 00.00.00 开始,结束时间应该在 23:59:59 结束
  • 更新了示例,使其只返回日期。
  • 我会使用DateTime(date.year, date.month, date.day - date.weekday % 7) 来获取最近的星期日的开始,并使用DateTime(date.year, date.month, date.day - (date.weekday - 1)) 来获取最近的星期一。如果您打算将它们用作日历日期,我会使用 DateTime.utc 作为构造函数。 (始终使用 UTC 作为日历日期,然后您可以安全地对其进行基于日期的算术运算)。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您执行此操作的方式可能取决于您的应用的本地化是什么。如果您想将星期日视为一周的开始,您可以这样做:

    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

    • formatFullDate:2021 年 1 月 26 日,星期二
    • 格式压缩日期:2021 年 1 月 26 日
    • formatMediumDate:1 月 26 日,星期二
    • formatShortDate:2021 年 1 月 26 日
    • formatShortMonthDay:1 月 26 日
    • formatMonthYear:2021 年 1 月
    • 格式年份:2021

    如果这些都不符合您的需求,您还可以使用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
    

    【讨论】:

    • 从星期日开始一周的计算不太正确,因为如果当天已经是星期日,它将返回上一个星期日。
    【解决方案5】:

    以上方法都不适合我,但@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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2018-10-05
      • 2012-03-12
      相关资源
      最近更新 更多