2016-06-07 53 views
2

在Objective-C中工作,我有一個方法來正確格式化從數據庫中獲得的日期。 數據庫返回沒有時區信息的日期和時間。例如'2016-06-07T09:29:50.253'。問題NSDateFormatter意外調整時間

問題是,它正確地獲取日期,然後將其返回一個小時。在我09:29的時候,我最終會在08:29結束。

我現在正在與BST合作。

我有以下代碼:

+(NSDate *)getDate:(NSString *)date { 

//Gets the date 
     date = [date stringByReplacingOccurrencesOfString:@"T" withString:@" "]; 
     date = [date componentsSeparatedByString: @"."][0]; 

//Formats the date 
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
//This line is the one that fixes it. 
     [formatter setTimeZone: [NSTimeZone timeZoneWithName:@"UTC"]]; 
     [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 

     NSDate *returnDate = [formatter dateFromString:date]; 
     return returnDate; 
    } 

我做了一些谷歌搜索,發現已增加以下行解決了這個問題。

[formatter setTimeZone: [NSTimeZone timeZoneWithName:@"UTC"]]; 

這是罰款,暫時的,但我擔心它會在夏令時再次突破,我完全不知道爲什麼這個修復它。我也希望能夠讓它適應不同的時區,但至今還沒有運氣。

更多信息:

-The日來自SQL Server中的GETDATE()調用。我對此的理解是,它是按照現在的日期,不理解時區。如果我做了選擇調用,我得到的結果是:「2016-06-07T09:29:50.253」

爲了形式化的問題: 爲什麼會在上面的代碼進行調整的returnDate?

+0

UTC是一個標準,而不是一個時區。爲此使用GMT。更多信息 - http://www.timeanddate.com/time/aboututc.html – Andriy

+0

請在08:29添加「結束」。你怎麼看日期?日期如何存儲在數據庫中 - 在某個時間點,時區將被聲明或已經被約定。 – jrturton

+2

爲什麼要刪除'T'和'.'後面的內容。將它們添加到日期格式。 – Larme

回答

0

有一個NSDate對象之間的一個重要區別,它是一個使用格式化表示:

NSDate對象永遠是相對於通用的標準時間(UTC)。它無視夏時制和時區,這就是您希望將其存儲在數據庫中的方式(作爲UTC時間戳)。

當您使用格式化程序時,它通常用於向用戶顯示日期。因此,格式化程序將默認使用當前設備的區域設置來表示日期,所以如果您的日期爲11:00,並且您在+4時區沒有夏令時,則您將獲得的日期將是15:00。如果有夏令時,時間會稍微改變。你需要這種行爲,因爲這意味着無論你在世界的哪個地方,用戶總會得到正確的相對時間。

除非像您一樣,默認格式化程序使用「UTC」區域設置,不應將其與「+0」時區混淆。這就是爲什麼你會得到不同的日期。

0

嘗試使用這個格式化器(而不是除去T和。):

let dateLiteral = "2016-06-07T09:29:50.253" 

let formatter = NSDateFormatter() 
formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'" 
formatter.dateFromString(dateLiteral) // Jun 7, 2016, 9:29 AM 
+0

您應該從格式化程序中移除'Z',因爲日期字符串中沒有'Z'。此外,僅供參考,'''僅在'T'周圍需要。 – Rob

+0

感謝@Rob給你評論。 –