From f50d54b60e007710cd10ba9ee24be85c3dcc1def Mon Sep 17 00:00:00 2001 From: Alexander Leisentritt Date: Thu, 9 Oct 2014 11:43:02 +0200 Subject: [PATCH 1/4] another test for international weekdays --- MTDatesTests/MTDatesTests.m | 56 +++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/MTDatesTests/MTDatesTests.m b/MTDatesTests/MTDatesTests.m index 6d79690..aebc2a8 100644 --- a/MTDatesTests/MTDatesTests.m +++ b/MTDatesTests/MTDatesTests.m @@ -1065,6 +1065,62 @@ - (void)test_firstDayOfWeek [NSDate mt_setFirstDayOfWeek:1]; } +- (void)test_firstDayOfWeek2 +{ + NSDate *date = [_formatter dateFromString:@"07/11/1986 09:23am"]; + + [NSDate mt_setFirstDayOfWeek:1]; + XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year] + week:[date mt_weekOfYear] + weekday:[date mt_weekdayOfWeek] + hour:[date mt_hourOfDay] + minute:[date mt_minuteOfHour]], date); + + [NSDate mt_setFirstDayOfWeek:2]; + XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year] + week:[date mt_weekOfYear] + weekday:[date mt_weekdayOfWeek] + hour:[date mt_hourOfDay] + minute:[date mt_minuteOfHour]], date); + + [NSDate mt_setFirstDayOfWeek:3]; + XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year] + week:[date mt_weekOfYear] + weekday:[date mt_weekdayOfWeek] + hour:[date mt_hourOfDay] + minute:[date mt_minuteOfHour]], date); + + [NSDate mt_setFirstDayOfWeek:4]; + XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year] + week:[date mt_weekOfYear] + weekday:[date mt_weekdayOfWeek] + hour:[date mt_hourOfDay] + minute:[date mt_minuteOfHour]], date); + + [NSDate mt_setFirstDayOfWeek:5]; + XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year] + week:[date mt_weekOfYear] + weekday:[date mt_weekdayOfWeek] + hour:[date mt_hourOfDay] + minute:[date mt_minuteOfHour]], date); + + [NSDate mt_setFirstDayOfWeek:6]; + XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year] + week:[date mt_weekOfYear] + weekday:[date mt_weekdayOfWeek] + hour:[date mt_hourOfDay] + minute:[date mt_minuteOfHour]], date); + + [NSDate mt_setFirstDayOfWeek:7]; + XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year] + week:[date mt_weekOfYear] + weekday:[date mt_weekdayOfWeek] + hour:[date mt_hourOfDay] + minute:[date mt_minuteOfHour]], date); + + [NSDate mt_setFirstDayOfWeek:1]; +} + - (void)test_firstWeekOfYear { NSDate *date = nil; From 6abf61999b63da0c8c469199a3a24b310a1e8178 Mon Sep 17 00:00:00 2001 From: Alexander Leisentritt Date: Thu, 9 Oct 2014 11:54:14 +0200 Subject: [PATCH 2/4] fix for weekday calculation when 1st weekday != 1 fix for weekday calculation when first weekday is not 1=sunday (if set explicitly by "+ (void)mt_setFirstDayOfWeek:(NSUInteger)firstDay" or implicitly by locale) --- MTDates/NSDate+MTDates.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MTDates/NSDate+MTDates.m b/MTDates/NSDate+MTDates.m index 0ad5f2a..d0016e0 100644 --- a/MTDates/NSDate+MTDates.m +++ b/MTDates/NSDate+MTDates.m @@ -392,6 +392,7 @@ - (NSInteger)mt_weekdayOfWeek NSInteger weekdayOfWeek = [[NSDate mt_calendar] ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfYear forDate:self]; + weekdayOfWeek += [[NSDate mt_calendar] firstWeekday] - 1; [[NSDate sharedRecursiveLock] unlock]; return weekdayOfWeek; } @@ -693,7 +694,7 @@ - (NSDate *)mt_startOfCurrentWeek { [[NSDate sharedRecursiveLock] lock]; NSInteger weekday = [self mt_weekdayOfWeek]; - NSDate *date = [self mt_dateDaysAfter:-(weekday - 1)]; + NSDate *date = [self mt_dateDaysAfter:-(weekday - [[NSDate mt_calendar] firstWeekday])]; NSDate *startOfCurrentWeek = [NSDate mt_dateFromYear:[date mt_year] month:[date mt_monthOfYear] day:[date mt_dayOfMonth] From 79d7e0567c5cf410c6436798e4b21b8b316b0885 Mon Sep 17 00:00:00 2001 From: Victor Ilyukevich Date: Fri, 10 Oct 2014 00:28:15 +0300 Subject: [PATCH 3/4] Fix calculation of `mt_weekdayOfWeek` It shouldn't return values more than 7 --- MTDates/NSDate+MTDates.m | 4 ++-- MTDatesTests/MTDatesTests.m | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/MTDates/NSDate+MTDates.m b/MTDates/NSDate+MTDates.m index d0016e0..bb15ab3 100644 --- a/MTDates/NSDate+MTDates.m +++ b/MTDates/NSDate+MTDates.m @@ -392,8 +392,8 @@ - (NSInteger)mt_weekdayOfWeek NSInteger weekdayOfWeek = [[NSDate mt_calendar] ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfYear forDate:self]; - weekdayOfWeek += [[NSDate mt_calendar] firstWeekday] - 1; - [[NSDate sharedRecursiveLock] unlock]; + weekdayOfWeek = (weekdayOfWeek + [[NSDate mt_calendar] firstWeekday] - 1) % 7; + [[NSDate sharedRecursiveLock] unlock]; return weekdayOfWeek; } diff --git a/MTDatesTests/MTDatesTests.m b/MTDatesTests/MTDatesTests.m index aebc2a8..8717b22 100644 --- a/MTDatesTests/MTDatesTests.m +++ b/MTDatesTests/MTDatesTests.m @@ -256,6 +256,32 @@ - (void)test_weekdayOfWeek XCTAssertEqual([date mt_weekdayOfWeek], 6); } +- (void)test_weekdayOfWeekRemainsTheSameInSpiteOfFirstDayOfAWeek +{ + NSDate *date = [_formatter dateFromString:@"10/09/2014 05:00am"]; // Thursday + + [NSDate mt_setFirstDayOfWeek:1]; + XCTAssertEqual([date mt_weekdayOfWeek], 5); + + [NSDate mt_setFirstDayOfWeek:2]; + XCTAssertEqual([date mt_weekdayOfWeek], 5); + + [NSDate mt_setFirstDayOfWeek:3]; + XCTAssertEqual([date mt_weekdayOfWeek], 5); + + [NSDate mt_setFirstDayOfWeek:4]; + XCTAssertEqual([date mt_weekdayOfWeek], 5); + + [NSDate mt_setFirstDayOfWeek:5]; + XCTAssertEqual([date mt_weekdayOfWeek], 5); + + [NSDate mt_setFirstDayOfWeek:6]; + XCTAssertEqual([date mt_weekdayOfWeek], 5); + + [NSDate mt_setFirstDayOfWeek:7]; + XCTAssertEqual([date mt_weekdayOfWeek], 5); +} + - (void)test_monthOfYear { NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"]; From 9a56b67d17d00ee6ee3499b43daee1c35649c6fd Mon Sep 17 00:00:00 2001 From: Victor Ilyukevich Date: Fri, 10 Oct 2014 00:29:06 +0300 Subject: [PATCH 4/4] Fix calculation of `mt_startOfCurrentWeek` If today is Monday, and we say that the week starts from Friday, then `mt_startOfCurrentWeek` for today should return Friday from the past. It should never return a day after the receiver. --- MTDates/NSDate+MTDates.m | 11 +++++++++-- MTDatesTests/MTDatesTests.m | 19 ++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/MTDates/NSDate+MTDates.m b/MTDates/NSDate+MTDates.m index bb15ab3..4ffd24b 100644 --- a/MTDates/NSDate+MTDates.m +++ b/MTDates/NSDate+MTDates.m @@ -692,9 +692,16 @@ - (NSDate *)mt_startOfPreviousWeek - (NSDate *)mt_startOfCurrentWeek { - [[NSDate sharedRecursiveLock] lock]; + [[NSDate sharedRecursiveLock] lock]; NSInteger weekday = [self mt_weekdayOfWeek]; - NSDate *date = [self mt_dateDaysAfter:-(weekday - [[NSDate mt_calendar] firstWeekday])]; + NSInteger firstWeekday = [NSDate mt_calendar].firstWeekday; + NSDate *date; + if (firstWeekday > weekday) { + date = [self mt_dateDaysBefore:7 - (firstWeekday - weekday)]; + } + else { + date = [self mt_dateDaysBefore:weekday - firstWeekday]; + } NSDate *startOfCurrentWeek = [NSDate mt_dateFromYear:[date mt_year] month:[date mt_monthOfYear] day:[date mt_dayOfMonth] diff --git a/MTDatesTests/MTDatesTests.m b/MTDatesTests/MTDatesTests.m index 8717b22..122961b 100644 --- a/MTDatesTests/MTDatesTests.m +++ b/MTDatesTests/MTDatesTests.m @@ -1065,28 +1065,45 @@ - (void)test_toTimeZone - (void)test_firstDayOfWeek { - NSDate *date = [_formatter dateFromString:@"07/11/1986 09:23am"]; + /* + * August 2012 + * Su Mo Tu We Th Fr Sa + * 1 2 3 4 + * 5 6 7 8 9 10 11 + * 12 13 14 15 16 17 18 + * 19 20 21 22 23 24 25 + * 26 27 28 29 30 31 + */ + + NSDate *date = [_formatter dateFromString:@"08/20/2012 09:23am"]; [NSDate mt_setFirstDayOfWeek:1]; XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Sun"); + XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:19]); [NSDate mt_setFirstDayOfWeek:2]; XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Mon"); + XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:20]); [NSDate mt_setFirstDayOfWeek:3]; XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Tue"); + XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:14]); [NSDate mt_setFirstDayOfWeek:4]; XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Wed"); + XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:15]); [NSDate mt_setFirstDayOfWeek:5]; XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Thu"); + XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:16]); [NSDate mt_setFirstDayOfWeek:6]; XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Fri"); + XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:17]); [NSDate mt_setFirstDayOfWeek:7]; XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Sat"); + XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:18]); [NSDate mt_setFirstDayOfWeek:1]; }