【问题标题】:How to obtain NSCalendarComponent values relative to time zone other than GMT?如何获取相对于 GMT 以外的时区的 NSCalendarComponent 值?
【发布时间】:2014-06-28 07:56:32
【问题描述】:

为什么以下标记的断言会失败?我只是在中欧的一台主机上运行这个单元测试。因此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)
}

【问题讨论】:

    标签: ios objective-c nsdateformatter nscalendar nstimezone


    【解决方案1】:

    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"];
    

    那么测试成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2019-10-14
      • 2019-04-06
      相关资源
      最近更新 更多