2017-05-25 167 views
2

我正在使用字符串擴展函數來轉換日期字符串。該功能是:SWIFT DateFormatter結果不一致

func convertDateString() -> String { 
    let dateFormater = DateFormatter() 
    var returnString = "" 
    dateFormater.dateFormat = "yyyy-MM-dd'T'hh:mm:ss'Z'" // Takes the format from the JSON journal entry for elite dangerous 
    dateFormater.locale = Locale.current 
    if let dateObj = dateFormater.date(from: self) { 
    dateFormater.dateFormat = "dd MMM yyyy hh:mm:ss"  // Converts it to a new string (as a date object) 
     returnString = dateFormater.string(from: dateObj) // Converts the date object back to a string 
    } else { 
     returnString = "Error converting date" 
    } 
    return returnString 
} 

我使用的數據集這是一個系列的JSON對象調用的字符串延伸的結果的一部分從JSON參考文件轉換的。

我正在兩臺機器上工作 - 一臺MACPRO和一臺MacBookAir。兩者都運行相同版本的MacOS(10.12.5)和相同版本的Xcode。

當我在MACPRO上運行應用程序時,它會解析JSON對象文件而不會出現問題,並按照上述函數中的預期正確轉換每個日期。但是,當我在MacBookAir上運行應用程序時,在完全相同的數據文件上,JSON對象文件似乎在沒有問題的情況下被解析,但是某些(幾個百分比)的日期不會按預期進行轉換 - 它們會失敗if let dateObj = dateFormater.date(from: self)語句和作爲「錯誤轉換日期」返回。

我不知道發生了什麼。我曾嘗試刪除dateFormater.locale = Locale.current,這沒有什麼區別。

相同的JSON對象產生錯誤(即每次運行文件時,它都是產生「錯誤轉換日期」響應的相同JSON對象)。當我在文本編輯器中查看JSON對象文件時,JSON對象似乎沒有問題(我也在一個在線JSON對象格式化程序中確認了這一點,並且它正確讀取了JSON對象。)

我也應該補充說我正在使用SwiftyJSON來解析JSON對象。

任何幫助或建議感激地收到。

有沒有辦法讓我的代碼更健壯?任何人都可以提出,爲什麼不同的機器可能會有所作爲,因爲應用程序的數據文件,Xcode和MacOS都是一樣的。

+2

Apple在[本文](https://developer.apple.com/library/content/qa/qa1480/_index.html)中寫了類似的問題。如果你的目標是OS X 10.12及以上版本,請使用['ISO8601DateFormatter'](https://developer.apple.com/reference/foundation/nsiso8601dateformatter) –

+1

你應該在你的問題中包含有問題的字符串。 – rmaddy

+0

你不應該去看Z.hh是錯誤的(這是12h格式)。你需要使用HH(00-23)。並將你的格式化區域設置爲'「en_US_POSIX」'。你應該檢查這個https://stackoverflow.com/questions/28016578/swift-how-to-create-a-date-time-stamp-and-format-as-iso-8601-rfc-3339-utc-tim/ 28016692#28016692 –

回答

0

謝謝所有回覆。

通過閱讀代碼的不同,專注於大衛提出加入以下行我的代碼問題所引用的文章後:

dateFormater.calendar = Calendar(identifier: .iso8601) 
    dateFormater.locale = Locale(identifier: "en_US_POSIX") 
    dateFormater.timeZone = TimeZone(secondsFromGMT: 0) 
代替「 dateFormater.locale = Locale.current」線的

。它現在可以很好地工作,並可以在設備之間交換而不會出現問題

+0

並且不要在格式中引用「Z」。一旦你解決了這個問題,你不再需要設置格式化器的'timeZone'。 – rmaddy

+0

時區是需要在返回字符串的方式,如果他想要它也是+0000。否則,正如rmaddy所指出的那樣,不要設置時區以使用當前的時區 –

+0

感謝您的額外評論。僅供參考 - 原始字符串中的'Z'包含在我正在解析的JSON對象中。 – Wolfstar

2

您的錯誤來自此行:dateFormater.locale = Locale.current。您的兩臺機器可能設置爲使用不同的區域設置。

在按住選項鍵的同時點擊運行,並檢查兩臺機器上的應用程序區域設置是什麼。

+0

嗨大衛 - 感謝您的答覆。我試圖從代碼中刪除該行,我仍然得到錯誤。當我按照你的建議並選擇澳大利亞或英國作爲區域時(代替「系統」設置),我仍然會得到同樣的錯誤 - 無論選擇哪個區域,這似乎仍然會發生。當兩臺機器都設置爲相同的特定區域時 - 與我原始問題中所述的結果相同。 – Wolfstar