Why do the following marked assertions fail? I was just running this unit test on a host in Central Europe. Hence NSCalendar.currentCalendar.timeZone
is CEST, i.e. GMT+0200. NSDateComponents
returns this time zone but its other values (for year, etc.) are apparently relative to GMT. How can I obtain values that are relative to CEST?
- (void)test {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mmZZZ";
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"CEST"];
XCTAssertEqual(2 * 60 * 60, dateFormatter.timeZone.secondsFromGMT, @"");
NSDate *time = [dateFormatter dateFromString:@"2014-01-01T00:00+0200"]; // midnight on a Wednesday
NSCalendar *calendar = NSCalendar.currentCalendar; // i.e. CEST
XCTAssertEqual(2 * 60 * 60, calendar.timeZone.secondsFromGMT, @"");
NSDateComponents *components = [calendar components: NSYearCalendarUnit |
NSMonthCalendarUnit |
NSDayCalendarUnit |
NSWeekdayCalendarUnit |
NSHourCalendarUnit |
NSMinuteCalendarUnit |
NSTimeZoneCalendarUnit
fromDate:time];
XCTAssertEqual(components.year, 2014, @""); // fails with 2013
XCTAssertEqual(components.month, 1, @""); // fails with 12
XCTAssertEqual(components.day, 1, @""); // fails with 31
XCTAssertEqual(components.weekday, 4, @""); // fails with 3 (Tuesday)
XCTAssertEqual(components.hour, 0, @""); // fails with 23
XCTAssertEqual(components.minute, 0, @""); // succeeds
XCTAssertEqual(components.timeZone.secondsFromGMT, 2 * 60 * 60, @""); // succeeds (CEST)
}