NSDateComponents - 结合日期和时间损失 1 小时?
NSDateComponents - Combining a date and time loses 1 hour?
我正在尝试将 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 小时?
问题很可能是您使用 NSLog(@"%@", date);
记录日期。这将以 UTC 记录时间,即 +0000。如果您不居住在使用 UTC 的国家/地区(例如英国、冰岛、加纳、葡萄牙...),这些日期可能与您预期的不同。 (另请参阅:)
如果您使用 NSDateComponents 创建日期,它会使用您当地的时区。根据您当地的时区,相同的当地时间(例如 01:00)全年在 UTC 中具有不同的表示形式。也称为夏令时。
在您的实验中,您在 3 月底看到了这种变化。这是一年中许多国家夏令时开始的时间。例如在德国,它于 3 月 29 日星期日早上 2:00 开始。这可以解释 3 月 30 日日志中的变化 1:00。
长话短说,使用其他方式记录您的日期。例如:
NSLog(@"%@", [NSDateFormatter localizedStringFromDate: combinedDate dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]);
我正在尝试将 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 小时?
问题很可能是您使用 NSLog(@"%@", date);
记录日期。这将以 UTC 记录时间,即 +0000。如果您不居住在使用 UTC 的国家/地区(例如英国、冰岛、加纳、葡萄牙...),这些日期可能与您预期的不同。 (另请参阅:)
如果您使用 NSDateComponents 创建日期,它会使用您当地的时区。根据您当地的时区,相同的当地时间(例如 01:00)全年在 UTC 中具有不同的表示形式。也称为夏令时。
在您的实验中,您在 3 月底看到了这种变化。这是一年中许多国家夏令时开始的时间。例如在德国,它于 3 月 29 日星期日早上 2:00 开始。这可以解释 3 月 30 日日志中的变化 1:00。
长话短说,使用其他方式记录您的日期。例如:
NSLog(@"%@", [NSDateFormatter localizedStringFromDate: combinedDate dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]);