2016-01-18 86 views
0

我正在使用NSDateFormatter從服務器時間字符串生成NSDate對象。我們使用ISO-8601擴展,並且在下面的方法我有一個返回的日期格式,處理轉型:NSDateFormatter返回無與表面上正確的格式字符串

+ (NSDateFormatter *) dateFormatter { 
    NSDateFormatter * dateFormatter = [NSDateFormatter new]; 
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ"; 
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US_POSIX"]; 
    return dateFormatter; 
} 

然而,當我使用該代碼,下面的斷言失敗:

NSDateFormatter * dateFormatter = [MyClass dateFormatter]; 
              // "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
_testDateObject = [dateFormatter dateFromString: @"2016-01-18'T'16:31:16.401Z"]; 
NSParameterAssert(_testDateObject); 

我使用的日期格式字符串有什麼問題?我試過了它的變體(比如逃離文字),並且它們都沒有產生有效的NSDate

編輯 我原來的文章包含了我使用的不正確的格式化字符串。正如rmaddy指出的那樣,我應該使用yyyy-MM-dd'T'HH:mm:ss.SSSZ,這就是我。

+1

閱讀的文檔日期格式說明符。閱讀你應該使用的年,日和小數秒.. – rmaddy

+1

密切相關:[無NSDate當試圖從祖魯時間的UTC字符串獲取日期](http://stackoverflow.com/q/1263455) –

+0

規範http://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table'DD'是一年中的第一天(1..356)。 'YYYY'不是日曆年。 'sss'是幾秒鐘。 'SSS'是小數秒。 – Sulthan

回答

2

您的問題是您的輸入字符串"2016-01-18'T'16:31:16.401Z"與您的格式不匹配。

在格式字符串中,'字符開始和結束轉義字符序列。格式子串'T'匹配輸入子串T,而不是輸入子串'T'。由於您的格式字符串中沒有任何內容與您輸入中的單引號匹配,因此轉換失敗。

如果你真的想你的輸入包含單引號,您必須在格式以匹配其使用兩個單引號,使用單引號逃脫T

let formatter = NSDateFormatter() 
formatter.dateFormat = "yyyy-MM-dd'''T'''HH:mm:ss.SSSZ" 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 

let date = formatter.dateFromString("2016-01-18'T'16:31:16.401Z") 

// Result: 
"Jan 18, 2016, 10:31 AM" 
+0

我仍然得到一個零結果,建議!鑑於我無法更改來自服務器的字符串格式,您對解析日期有何建議?我嘗試使用「yyyy-MM-dd''T''HH:mm:ss.SSSZ」(注意T周圍的兩個單引號),但這並沒有解決問題。 –

+0

我已經更新了我的答案。 –

+0

感謝羅布,解決了我的問題!我很好奇爲什麼我需要一對額外的逃避順序而不是兩個。這是因爲解析器需要額外的一組引用來知道它應該跳過第二對引號? –