NSDateComponents - 结合日期和时间会损失1小时?

时间:2015-02-26 10:10:06

标签: objective-c date nsdatecomponents

我正在尝试将NSDate(日期)和NSDate(时间)组合成一个新的NSDate对象,无论出于什么原因,我似乎要失去1小时。

我有一组格式化的时间对象,每个对象间隔15分钟。 我有一个可选的日期项,它引用了一个NSDate对象。

用户选择格式化的时间对象(我在字典中引用了NSDate)然后选择保存;我这样做了;

if (self.selectedDate && self.selectedTimeObject)
    {
        // Combine selected date and selected time into a new NSDate object
        NSCalendar *cal = [NSCalendar currentCalendar];

        unsigned unitFlagsDate = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
        unsigned unitFlagsTime = NSHourCalendarUnit | NSMinuteCalendarUnit |  NSSecondCalendarUnit;

        NSDateComponents *dateComponents = [cal components:unitFlagsDate fromDate:self.selectedDate];
        NSDateComponents *timeComponents = [cal components:unitFlagsTime fromDate:self.selectedTimeObject];

        [dateComponents setSecond:[timeComponents second]];
        [dateComponents setHour:[timeComponents hour]];
        [dateComponents setMinute:[timeComponents minute]];

        NSDate *combinedDate = [cal dateFromComponents:dateComponents];
        NSLog(@"targetDate = %@", combinedDate);
    }

在我的例子中,我选择01:00;但由于某种原因,我会失去1小时,具体取决于日期。

日志;

targetDate = 2015-03-31 00:00:00 +0000
targetDate = 2015-03-30 00:00:00 +0000
targetDate = 2015-03-29 01:00:00 +0000
targetDate = 2015-03-28 01:00:00 +0000
targetDate = 2015-03-27 01:00:00 +0000
targetDate = 2015-03-31 00:00:00 +0000
targetDate = 2015-04-01 00:00:00 +0000
targetDate = 2015-04-02 00:00:00 +0000

现在在我的日志中,我注意到28之前的任何事情都没问题,但是那个日期之后的任何事情都会在没有解释的情况下失去1小时。

我检查过我的数组,检查了索引,检查了对象是否为有效时间对象;但是我很难过 - 为什么它会失去一个小时?

1 个答案:

答案 0 :(得分:3)

问题很可能是您使用NSLog(@"%@", date);来记录日期。这将记录UTC的时间,即+0000。如果您不居住在使用UTC的国家(例如英国,冰岛,加纳,葡萄牙......),这些日期似乎与您的预期不同。 (另见:https://stackoverflow.com/a/4976950/457406

如果您使用NSDateComponents创建日期,则会使用您当地的时区。根据您当地的时区,当地时间(例如01:00)在全年的UTC中有不同的表示形式。也称为夏令时。

在您的实验中,您看到了3月底的变化。在许多国家,夏令时开始的一年中的哪个时间。例如在德国,它将于3月29日星期日凌晨2点开始。这将解释3月30日1:00日志的变化。

总而言之,请使用其他内容记录您的日期。例如:

NSLog(@"%@", [NSDateFormatter localizedStringFromDate: combinedDate dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]);