2013-05-17 132 views
-1

我正在嘗試創建一個時間設置爲12:00:01 am的日期。秒和分鐘正確地設置了它們的值,但小時值總是達到我設置的值+ 4.爲什麼是4?這個價值有什麼特別之處?分鐘和秒的值設置爲我想要的正確,但它似乎小時值只是增加而不是替代。NSDateComponent setHour設置不正確

這裏是代碼,

 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年5月17日4時00分01秒0000

currentTime的:2013年5月17日15: 00:37 +0000

+1

這也可能是您的本地時間和UTC之間的差別。你在什麼時區? – Aaron

+0

我在美國東部時間。但爲什麼會有所作爲呢?無論時區如何,0都應爲0。它實際上是在嘗試自動調整嗎?如果是的話,爲了解決這個問題我需要做些什麼? – JMD

+0

默認情況下[NSDate date]爲您提供原始日期,並且不會假定當地時區。 – Aaron

回答

0

EST比格林威治標準時間提前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; 
} 
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 
0

的問題是,你的日期是正確的,但他們相對於設備的時區UTC被記錄,並且顯得撲朔迷離。 (起初)

您的比較時間是正確的。它被設置爲午夜你的時間和UTC輸出,如果你EST午夜將是凌晨4點UTC:

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.線程進一步有助於解釋: