2011-07-28 31 views
7

我的國家位於GMT + 0。我們現在是+1小時,因爲我們在夏令時。iPhone - 考慮夏令時的當前日期

當我做

[NSDate date]; 

它應該返回當前的日期和時間,但是當我這樣做,我收到GMT時間不考慮夏令時。

這就是文檔說的date命令

創建並返回一個新的日期設置爲當前日期和時間。

蘋果爲什麼這麼做?爲什麼一切都如此複雜?這是一個錯誤?有沒有辦法獲得設備當前的實時狀態?與設備時鐘上顯示的時間相同嗎?

我的應用取決於日期和時間,並且位於世界各地夏令時或冬季的不同時區的用戶的日期錯誤將會是一場災難。

謝謝。


編輯

幾個答案後,我曾嘗試這樣的代碼:

NSDate *wrongToday = [NSDate date]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; 

[dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
NSString *currentTime = [dateFormatter wrongToday]; 

NSDate *today = [dateFormatter dateFromString:currentTime]; 

你猜怎麼着,今天= wrongToday ... 換句話說,沒有任何變化,我繼續有沒有夏令時的錯誤日期。 更令人驚訝的是,CurrentTime在NSString中顯示日光節約的日期...

任何線索?再次感謝。

+2

NSDate對象表示絕對時刻。它們不受夏令時或時區的影響。要在特定時區輸出日期,您應該創建一個NSDateFormatter的實例。 – albertamg

+1

對不起,但Apple文檔說[NSDate date]返回當前的日期和時間,這是不正確的。當前日期和時間必須考慮夏令時。 – SpaceDog

+2

時區和夏令時是本地化問題。文件提到格林尼治標準時間在許多地方,但他們當然可以更清楚。 – MRAB

回答

2

在網站上有幾個很好的答案已經hereherehereNSDate是自(UTC)參考日期以來的時間間隔,但您可以在這些答案中詳細使用NSTimeZone

+0

我編輯了這個問題,包括一些代碼...請閱讀它。 – SpaceDog

8

albertamg,MRAB和Joe Osborn都是正確的。他們都試圖向你解釋NSDate是一個「數字」,「絕對時刻」。

此值爲獨立無論您是在倫敦,洛杉磯還是在新加坡。這與您的縣是否尊重夏令時無關。你需要一個NSDateFormatter。你需要一個NSDateFormatter。你需要一個可識別的東西(比如「Th 7月28日,下午4:28」),你需要一個NSDateFormatter。您還需要確保您的語言環境已正確定義:包括時區,是否遵守夏令時以及各種時間/日期格式約定。

「希望幫助..

+0

我編輯了這個問題以包含一些代碼...請閱讀它。 – SpaceDog

4

硬編碼:

BOOL isDayLightSavingTime = [sysTimezone isDaylightSavingTimeForDate:currentDate]; 
if (isDayLightSavingTime) { 
    NSTimeInterval timeInterval = [sysTimezone daylightSavingTimeOffsetForDate:currentDate]; 
    currentDate = [currentDate dateByAddingTimeInterval:timeInterval]; 
} 

當前日期現在夏令時。

希望有所幫助。

3

我的建議!

NSString *dateToTest = @"16-10-2016"; // <-- daylight saving 
NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; 

[dateformatter setDateFormat:@"dd-MM-yyyy"]; 

NSDate *data = [dateformatter dateFromString:dateToTest]; 

NSLog(@"data before --> %@:", data); 


if (data == nil && [[NSTimeZone systemTimeZone] isDaylightSavingTimeForDate:data]) { 

    NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName:[NSTimeZone localTimeZone].name]; 

    [dateformatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:[timeZone secondsFromGMT]]]; 

    data = [dateformatter dateFromString:dateToTest]; 

    NSLog(@"data after --> %@:", data); 
}