-1

我正在尝试创建一个时间设置为上午 12:00:01 的日期。秒和分钟正确设置为它们的值,但小时值总是变为我设置的值,+ 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);

输出是:

比较时间:2013-05-17 04:00:01 +0000

当前时间:2013-05-17 15:00:37 +0000

4

3 回答 3

0

问题是您的日期是正确的,但它们是以相对于您设备的时区的 UTC 登录的,这似乎令人困惑。(一开始是这样)

您的比较时间是正确的。它设置为您的时间午夜并输出为 UTC,如果您是 EST 午夜将是凌晨 4 点 UTC:

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

当前时间也是正确的,同样是相对于您的设备时区的 UTC 时间:

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

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

此代码(可耻地从下面列出的线程中窃取)应将compareTimeUTC 日期输出为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];

这里有一些 SO 线程可以帮助进一步解释:

于 2013-05-17T15:58:17.260 回答
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
于 2013-05-17T15:11:56.893 回答
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;
}
于 2013-05-17T15:06:43.363 回答