NSDateComponent setHour未正确设置

时间:2013-05-17 14:58:01

标签: iphone ios objective-c

我正在尝试创建一个时间设置为12:00:01 am的日期。秒和分钟设置正确的值,但小时值总是达到我设置的值+ 4。为什么4?这个价值有什么特别之处?分钟和秒的值设置为我想要的正确但似乎小时值只是添加而不是替换。

这是代码,

        NSDate *now = [NSDate date];
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
        [components setHour:0];
        [components setMinute:0];
        [components setSecond:1];

        NSDate *compareTime = [calendar dateFromComponents:components];
        NSLog(@"compareTime: %@", compareTime);
        NSLog(@"currentTime: %@", now);

输出是:

compareTime:2013-05-17 04:00:01 +0000

currentTime:2013-05-17 15:00:37 +0000

3 个答案:

答案 0 :(得分:0)

美国东部时间比格林威治标准时间早4小时,因此您的抵消。以下是我们用于创建日期加上和减去当地时区当前时间的一些代码。

- (NSDate *) getDateWithHoursOffset : (int) aHourInt
{
CFGregorianDate gregorianStartDate, gregorianEndDate;
CFGregorianUnits startUnits = { 0,0,0, aHourInt,0,0 }; //2 hours before
CFGregorianUnits endUnits   = { 0,0,0, 8,0,0 }; //5 hours ahead
CFTimeZoneRef timeZone = CFTimeZoneCopySystem();

gregorianStartDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(), timeZone, startUnits),timeZone);
gregorianStartDate.minute = 0;
gregorianStartDate.second = 0;

gregorianEndDate = CFAbsoluteTimeGetGregorianDate(CFAbsoluteTimeAddGregorianUnits(CFAbsoluteTimeGetCurrent(), timeZone,   endUnits),timeZone);
gregorianEndDate.minute = 0;
gregorianEndDate.second = 0;

NSDate* startDate = [NSDate dateWithTimeIntervalSinceReferenceDate:CFGregorianDateGetAbsoluteTime(gregorianStartDate, timeZone)];
CFRelease(timeZone);
return startDate;
}

答案 1 :(得分:0)

NSDates独立于时区而存在。如果您需要在应用程序中显示12:00:01的日期,则应使用NSDateFormatter。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterFullStyle];

NSLog(@"formattedTime: %@", [dateFormatter stringFromDate:compareTime]);

返回:

formattedTime: 12:00:01 AM Central Daylight Time

答案 2 :(得分:0)

问题是您的日期是正确的,但是相对于您设备的时区,它们会以UTC格式记录,这似乎令人困惑。 (最初是)

您的比较时间是正确的。设置为午夜你的时间并输出为UTC,如果你是午夜时间是美国东部标准时间凌晨4点:

compareTime: 2013-05-17 04:00:01 +0000

当前时间也是正确的,再次是相对于设备时区的UTC时间:

currentTime: 2013-05-17 15:00:37 +0000

你的时间是正确的,它的输出是欺骗你的。

此代码(从下面列出的线程中可耻地被盗)应将compareTime的UTC日期输出为00:00:01 +0000。虽然对于日期计算,UTC应该没问题。

NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

NSDate* destinationDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:compareTime];

以下是一些S.O.线程有助于进一步解释:

相关问题