Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get start of or end of week in dart

Tags:

datetime

dart

How can I get the start of or end of a week in dart? An example is if three days ago was a Monday, and today is a Wednesday, how can I find the start of the week using dart, that is on Monday

like image 234
Jama Mohamed Avatar asked Aug 30 '25 18:08

Jama Mohamed


2 Answers

Dart DateTimes have a weekday getter which is 1 for Monday and 7 for Sunday. Using that, I would do:

DateTime mostRecentSunday(DateTime date) =>
    DateTime(date.year, date.month, date.day - date.weekday % 7);

to get the most recent Sunday (which is the start of the current week if the week starts on a Sunday), and

DateTime mostRecentMonday(DateTime date) =>
    DateTime(date.year, date.month, date.day - (date.weekday - 1));

for the most recent Monday (which is then the start of the current week if the week starts on a Monday).

You can generalize to

/// 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);

If you are going to be using the results as calendar dates, I'd used DateTime.utc as the constructor instead. (Always use UTC for calendar dates, then you can do day-based arithmetic on them safely).

I'd even consider using DateTime.utc in any case because it avoids any potential issues with a daylight saving that starts at midnight (rare, but with time zones, even unlikely things tend to have happened somewhere at some point).

like image 114
lrn Avatar answered Sep 02 '25 20:09

lrn


You can get the weekday from the DateTime using https://api.dart.dev/stable/2.5.1/dart-core/DateTime/weekday.html and add/subtract this number from you date:

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);

UPDATE

Please read and upvote the answer from lrn. He knows a lot more about this stuff than me. :)

like image 37
julemand101 Avatar answered Sep 02 '25 20:09

julemand101