如何获取相对于GMT以外的时区的NSCalendarComponent值?

时间:2014-06-28 07:56:33

标签: ios objective-c nsdateformatter nscalendar nstimezone

为什么以下标记的断言失败?我刚刚在中欧的主机上进行了这个单元测试。因此NSCalendar.currentCalendar.timeZone是CEST,即GMT + 0200。 NSDateComponents返回此时区,但其他值(年份等)显然与GMT相关。如何获得与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)
}

1 个答案:

答案 0 :(得分:2)

NSCalendar.currentCalendar.timeZone是CEST或GMT + 02 现在因为夏令时现在在您的时区中有效。但是在2014-01-01,夏令时未激活。因此,该日期的所有转换均使用GMT + 01偏移完成。

所以这就是你的情况:

  • 字符串" 2014-01-01T00:00 + 0200"转换为NSDate" 2013-12-31 22:00:00 + 0000",因为您明确指定了GMT偏移" + 0200"在输入字符串中。 将dateFormatter.timeZone设置为" CEST"因此没有效果。

  • NSDate" 2013-12-31 22:00:00 + 0000"转换为日期组件,使用您的 当前日历。由于该日期的GMT偏移 是" GMT + 0100",你得到了 对应于" 2013-12-31 23:00:00 + 0100"的日期组件。

如果您使用

进行计算
NSDate *time = [dateFormatter dateFromString:@"2014-01-01T00:00+0100"];

然后测试成功。