来自NSDateComponents的NSDate:我为什么每天都会出错?

时间:2014-05-06 15:47:53

标签: ios objective-c nsdate nsdatecomponents

我有约会。

NSLog将其显示为:

2014-05-11 21:59:59 +0000

现在我希望获得相同的日期,但小时,分钟和秒设置为零:

2014-05-11 00:00:00 +0000

我的代码:

    NSCalendar *calendar = [NSCalendar currentCalendar];
    [calendar setTimeZone:[NSTimeZone localTimeZone]];
    NSDateComponents *components = [calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:dayOfWeek];
    NSLog(@"components: %@", components);

    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setYear:[components year]];
    [comps setMonth:[components month]];
    [comps setDay:[components day]];
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];
    NSLog(@"New date: %@", [calendar dateFromComponents:comps]);

NSLog显示:

2014-05-10 22:00:00 +0000

似乎日期和小时计算错误。 请注意,我在德国,但我使用[NSTimeZone localTimeZone],因为我认为这应该返回正确的时区?

1 个答案:

答案 0 :(得分:6)

真的没有问题......还是:

NSDate始终为UTC。当您致电NSLog时,它会显示在夏令时间关闭时伦敦的时间。因此,您的初始NSDate在伦敦晚上10点之前是一秒钟,夏令时关闭(UTC),午夜前一秒钟。然后,您计算一个刚刚在德国开始的NSDate。在那个时间点,它是在UTC的前一天晚上10点,这是NSLog显示的内容。