簡體   English   中英

NSDateFormatter在swift和iOS SDK 8.0中返回nil

[英]NSDateFormatter returns nil in swift and iOS SDK 8.0

我正在閱讀Raywenderlich提供的教程, 第29章測試的新功能 ,並遇到一個奇怪的問題。

以下是教程中將字符串轉換為日期的代碼:

// Convert date string to date.
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz"
var date: NSDate? = dateFormatter.dateFromString(dateString)

dateString是表單的

2014-06-21 14:56:00 EST

但是,日期變量始終為零。

注意:在操場上播放此代碼時,它可以正常工作,如圖所示:

在此輸入圖像描述

我在iOS SDK 8.0中工作。 這是SDK的錯誤嗎?


更新

我正在使用iOS 8的最新iPod Touch進行測試。

設置dateFormat字符串時,還必須將locale屬性設置為與提供的格式兼容的屬性。 否則,區域設置將基於可能不兼容的設備設置。

您在此處提供的日期格式將使用“en”語言環境,但它不適用於許多其他語言,例如“eu”。 這是一個例子:

let dateString = "2014-06-21 14:56:00 EST"

let localeStr = "eu" // this will give nil
let localeStr = "us" // this will succeed

let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: localeStr)
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz"
var date: NSDate? = dateFormatter.dateFromString(dateString)

這里的問題是“EST”,它只存在於北美洲。 在所有其他語言環境中,它是無效的時區。 如果您將日期字符串更改為:

"2014-06-21 14:56:00 UTC-5"

然后,無論locale設置的值是什么,日期都將正確格式化。

NSDateFormatter的行為很大程度上取決於它的locale 默認情況下,它使用設備區域設置。 如果要從中獲得一致的結果,則應手動指定locale 在大多數情況下, en_US_POSIX是最好的。

該文件說:

如果您正在使用固定格式的日期,則應首先將日期格式化程序的區域設置設置為適合您的固定格式的區域設置。 在大多數情況下,最佳選擇的語言環境是en_US_POSIX,這是一種專門設計用於產生美國英語結果的語言環境,無論用戶和系統偏好如何。 en_US_POSIX在時間上也是不變的(如果美國,在未來的某個時刻,它會改變格式化日期的方式,en_US將改變以反映新行為,但en_US_POSIX將不會),以及平台之間(en_US_POSIX在iPhone上的工作方式相同)操作系統與OS X上的操作系統一樣,並且與其他平台上的操作系統相同。

像這樣:

let dateString = "2014-06-21 14:56:00 EST"

let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz"
var date: NSDate? = dateFormatter.dateFromString(dateString)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM