2010-04-05 37 views
3

我有在生產應用程序從用戶輸入的日期計算GMT日期下面的代碼:的NSDate - GMT在iPhone上

NSDate *localDate = pickedDate; 
    NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method 
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset; 
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval]; 

的代碼工作正常,直到可怕的夏令時生效上週在英國發生的一切。

如何將日期轉換爲GMT,同時考慮到夏令時?

回答

6

NSDate使用絕對值的偏移來表示時間間隔。基礎是格林尼治標準時間,所有時間間隔都是格林尼治標準時間,這就是爲什麼你看到不同。如果你想要一個字符串表示你的日期(比如用於存儲在數據庫中或其他),使用NSDateFormatter在你需要的任何特定時區創建它。

所以,這總是會給你一個字符串表示(比如用於存放在MySQL)在GMT日期(用一大跳節省時間佔):

NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease]; 
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; // e.g., set for mysql date strings 
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 
NSString* mysqlGMTString = [formatter stringFromDate:[NSDate date]]; 

這會給你正確的日期字符串在GMT時間內,不管當地時區如何。另外,請記住,所有使用NSDate和時間間隔進行的相對測量都以GMT爲基礎。使用日期格式化程序和日曆對象將它們轉換爲更有意義的內容時,或者需要執行日曆計算(例如,顯示您的訂閱明天到期的警告)。

編輯:我忘了添加時區!沒有它,格式化程序將使用系統時區。

+1

可以使用NSDateFormatter以及轉換成NSDate的: http://stackoverflow.com/questions/1578577/nsdateformatter-datefromstring-will-not-parse-a-particular-date-string/1586083#1586083 – 2010-04-06 00:25:44

+0

@ Epsilon Prime:是的,但他特別提出了使用日期和時區來處理不一定是字符串的問題。我選擇了這個例子,因爲這是人們希望從當地時區轉換到另一個基礎(如GMT)的常見原因。 – 2010-04-06 00:28:57