2017-04-07 58 views
0

我有以下問題。讓我們假設我從服務器接收包含日期時間格式如下一些字符串:如何從字符串中獲取NSDate而不將其轉換爲UTC

yyyy-MM-dd'T'HH:mm:ssxxxx 

這是一個服務器的日期時間,我想在應用程序中顯示,因爲它是。所以,如果我收到日期時間:

2017-04-07T10:29:23+ 02:00 

這意味着在服務器10:29:23 (08:29:23 UTC)

,我想在應用程序中顯示它:

04.07.2017 10:29:23 

但每當我嘗試轉換NSDate的字符串我得到日期轉換爲UTC,這是不希望的,因爲我失去了有關服務器時區的信息。我現在使用以下代碼:

let formatter = NSDateFormatter() 
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601) 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssxxxx" 

let date = formatter.dateFromString(dateString) 

我該如何在Swift(2.3)中實現?

在此先感謝。

+1

你的代碼是正確的。如果你打印日期,你會得到UTC。在操場上試試吧。兩個註釋:'xxxx'可以替換爲'Z',並且在日期字符串中,加號/減號和時區值之間不能有空格字符。 – vadian

+0

感謝您的回覆。是的,我知道它會給我一個UTC,但正如我上面寫的,我不想這樣。我想顯示服務器的日期時間,因爲我收到了。所以例如如果在服務器上是10:00(8:00 UTC),我還想在應用程序中顯示10:00(獨立於應用程序時區)。 – smq93

+1

如果您想忽略時區,則必須從日期字符串中去除時區信息(例如,使用'replaceOccurrencesOfString'和'RegularExpression'選項)。 – vadian

回答

0

好的,所以最後我已經設法使用你的提示來解決問題。

下面的代碼符合我的期望:

let formatter = NSDateFormatter() 
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601) 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssxxxx" 

let timeZonePattern = "([+-]([01][0-9]):[0-5][0-9])$" // e.g. "+02:00" 
let regex = try! NSRegularExpression(pattern: pattern, options: []) 
let dateStringWithoutTimeZone = regex.stringByReplacingMatchesInString(dateString, options: [], range: NSMakeRange(0, dateString.characters.count), withTemplate: "Z") 

let date = formatter.dateFromString(dateStringWithoutTimeZone) 

謝謝大家!

2

NSDate沒有內置時區。如果你printNSDate那麼它將在GMT打印,因爲它必須打印東西。但日期本身不包含時區,也不包含時區。他們是時區獨立的。

要在特定時區打印日期,請使用所需的格式和時區配置NSDateFormatter,然後使用.stringFromDate。或者不要設置時區,並且它會打印在設備的時區和區域設置中,可能是您的用戶期望的內容(例如,您的服務器說「事件發生在00:23 + 02:00」,因此您的CET用戶'會顯示'事件發生在23:23「,並且您的EST用戶顯示」事件發生在6:23 PM「)。

令人沮喪的是,您只剩下一個問題:日期格式化程序瞭解原始字符串(+02:00)中的時區,但無法通過任何方式向您傳達。因此,如果您想採用NSDate並將其與您的服務器在同一時區打印出來,那麼您將不得不自己確定時區,通過另一個通道進行通信,或對其進行硬編碼。

相關問題