Skip to content

Commit 6ec373d

Browse files
authored
First and Last days extensions added #51
2 parents d11e087 + 23ec82b commit 6ec373d

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

lib/src/extensions.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,26 @@ extension DateTimeTimeExtension on DateTime {
204204
microsecond ?? this.microsecond,
205205
);
206206
}
207+
208+
/// Returns the Monday of this week
209+
DateTime get firstDayOfWeek =>
210+
isUtc ? DateTime.utc(year, month, day + 1 - weekday) : DateTime(year, month, day + 1 - weekday);
211+
212+
/// Returns the Sunday of this week
213+
DateTime get lastDayOfWeek =>
214+
isUtc ? DateTime.utc(year, month, day + 7 - weekday) : DateTime(year, month, day + 7 - weekday);
215+
216+
/// Returns the first day of this month
217+
DateTime get firstDayOfMonth => isUtc ? DateTime.utc(year, month, 1) : DateTime(year, month, 1);
218+
219+
/// Returns the last day of this month (considers leap years)
220+
DateTime get lastDayOfMonth => isUtc ? DateTime.utc(year, month + 1, 0) : DateTime(year, month + 1, 0);
221+
222+
/// Returns the first day of this year
223+
DateTime get firstDayOfYear => isUtc ? DateTime.utc(year, 1, 1) : DateTime(year, 1, 1);
224+
225+
/// Returns the last day of this year
226+
DateTime get lastDayOfYear => isUtc ? DateTime.utc(year, 12, 31) : DateTime(year, 12, 31);
207227
}
208228

209229
extension DurationTimeExtension on Duration {

test/time_test.dart

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,58 @@ void main() {
527527
expect(later.isUtc, isTrue);
528528
});
529529
});
530+
531+
group('can get first/last days', () {
532+
test('first day of week', () {
533+
final initial = DateTime(2022, 5, 20);
534+
final expected = DateTime(2022, 5, 16);
535+
expect(initial.firstDayOfWeek, expected);
536+
});
537+
538+
test('last day of week', () {
539+
final initial = DateTime(2022, 5, 20);
540+
final expected = DateTime(2022, 5, 22);
541+
expect(initial.lastDayOfWeek, expected);
542+
});
543+
544+
test('first day of month', () {
545+
final initial = DateTime(2022, 5, 20);
546+
final expected = DateTime(2022, 5, 1);
547+
expect(initial.firstDayOfMonth, expected);
548+
});
549+
550+
group('last day of month', (){
551+
test('last day of month', () {
552+
final initial = DateTime(2022, 5, 20);
553+
final expected = DateTime(2022, 5, 31);
554+
expect(initial.lastDayOfMonth, expected);
555+
});
556+
test('february not leap year', () {
557+
final initial = DateTime(2022, 2, 20);
558+
final expected = DateTime(2022, 2, 28);
559+
expect(initial.lastDayOfMonth, expected);
560+
});
561+
562+
test('february leap year', () {
563+
final initial = DateTime(2020, 2, 20);
564+
final expected = DateTime(2020, 2, 29);
565+
expect(initial.lastDayOfMonth, expected);
566+
});
567+
568+
});
569+
570+
test('first day of year', () {
571+
final initial = DateTime(2022, 5, 20);
572+
final expected = DateTime(2022, 1, 1);
573+
expect(initial.firstDayOfYear, expected);
574+
});
575+
576+
test('last day of year', () {
577+
final initial = DateTime(2022, 5, 20);
578+
final expected = DateTime(2022, 12, 31);
579+
expect(initial.lastDayOfYear, expected);
580+
});
581+
});
530582
});
531583
});
532584

@@ -564,4 +616,4 @@ void main() {
564616
expect(extraTime >= 0, true);
565617
});
566618
});
567-
}
619+
}

0 commit comments

Comments
 (0)