2014-05-06 91 views
1

以下代碼將date設置爲零。爲什麼我的格式化程序返回nil NSDate

NSString *dateString = @"2014-04-27T04:20:07.000-04:00"; 
NSString *UTC_FORMAT = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:UTC_FORMAT]; 
NSDate *date = [formatter dateFromString:dateString]; 

我在做什麼錯?

我試過UTC_FORMAT許多其他不同的變化,但councln't似乎沒有得到它。對於單引號的時間和地點,我也有點困惑。在玩了一段時間之後,我假設它可以繞過不應該被格式化器解釋的字符,但這是一個單獨的事情。

相關鏈接,不由我:

  1. Apple Docs: Data Formatting Guid
  2. SO: Why is NSDateFormatter returning nil?

格式,我試過:

NSString *UTC_FORMAT = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"; 
NSString *UTC_FORMAT = @"yyyy-MM-dd'T'HH:mm:ss-Z"; 
+0

的是所有的撇號真的neccessarry格式字符串?這可能是它不起作用的原因。 – Bedford

+0

我試過沒有撇號的相同的字符串。上面的'UTC_FORMAT'是直接從Apple Docs中獲取的。 – tambykojak

+0

刪除你的'UTC_FORMAT'中的引號(''),它將是'@「yyyy-MM-dd'T'HH:mm:ss-Z」'? – Bharat

回答

1

您的日期看起來像RFC3339格式的相當標準的JSON日期格式。但是,這些日期可以格式化的可能性有幾種。在這種情況下,您的日期字符串包含毫秒。你的日期格式沒有,所以這是行不通的。以下代碼將首先檢查沒有小數秒的日期,然後檢查小數秒的日期。此外,您正在尋找一個文字字符Z而不是時區。

的「X5」在

http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns

和轉換時區,在相當靈活的方式記錄,包括中間的結腸。 .SSSSSS會將秒的小數部分轉換爲微秒。如果你給納秒,將它改爲九個S字符。

我忘了區域信息...

NSString *UTC_FORMAT = @"yyyy'-'MM'-'dd'T'HH':'mm':'ssX5"; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:UTC_FORMAT]; 
enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
gmtTimeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 
[formatter setLocale:enUSPOSIXLocale]; 
[formatter setTimeZone:gmtTimeZone]; 
NSDate *date = [formatter dateFromString:dateString]; 

if (date == nil) 
{ 
    NSString *UTC_FORMAT2 = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSSSSX5"; 
    NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init]; 
    [formatter2 setDateFormat:UTC_FORMAT2]; 
    [formatter2 setLocale:enUSPOSIXLocale]; 
    [formatter2 setTimeZone:gmtTimeZone]; 
    date = [formatter2 dateFromString:dateString]; 
} 
+0

你真棒。謝謝。 – tambykojak

0

爲了避免當前區域的依賴,增加:

NSString *dateString = @"2014-04-27T04:20:07.000-04:00"; 
NSString *UTC_FORMAT = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:UTC_FORMAT]; 
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 
NSDate *date = [formatter dateFromString:dateString]; 
相關問題