2011-04-21 71 views
7

我正在嘗試設置「2011-04-21 03:31:37.310396」之類的日期格式。我想我沒有得到正確的小數秒。我正在查看http://unicode.org/reports/tr35/tr35-10.html#Date_Format_Patterns關於如何指定它的指導原則,我認爲我的問題本身就是格式。NSDateFormatter的設置日期格式

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ssSSSSSS";  
NSDate* serverDate = [dateFormatter dateFromString:stringFormOfDate];  

幫助?

+0

秒和微秒之間的缺失點僅僅是文章中的錯字? – 2011-04-21 23:44:45

+1

你怎麼知道這是不對的?嘗試將其與毫秒值進行比較。 – Sulthan 2011-10-29 20:09:59

回答

22

嘗試

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSSSSS";  
NSDate* serverDate = [dateFormatter dateFromString:@"2011-04-21 03:31:37.310396"]; 

NSLog(@"%@", serverDate); 

我想你大概忘了點

+6

雖然這似乎工作注意'NSDateFormatter'輸出限於毫秒。過3的任何「S」格式字符將產生「0」。這同樣適用於創建日期。該示例的時間間隔產生:「325063897.310000」。所以這可能不會真正回答這個問題,因爲396微秒丟失了。 (在OSX上測試,不是iPhone) – zaph 2013-07-15 19:53:01

+0

完全正確,好點,只是一個複製和粘貼問題:) – suprandr 2013-07-16 18:14:21

5

按在對方的回答Zaph的評論:S的最大數量爲3更多的只是生產零。

E.g.

dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSSSSS"; // Last 3 'S' ignored. 

Then @"2011-04-21 03:31:37.311396" will produce 2011-04-21 03:31:37.311000 

要保持充分的微秒級精度試試這個神奇:

-(NSDate *)_dateFromUtcString:(NSString *)utcString{ 
    if(!utcString){ 
     return nil; 
    } 
    static NSDateFormatter *df = nil; 
    if (df == nil) { 
     df = [[NSDateFormatter alloc] init]; 
     [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
     [df setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
    } 

    NSArray* parts = [utcString componentsSeparatedByString:@"."]; 
    NSDate *utcDate = [df dateFromString:parts[0]]; 
    if(parts.count > 1){ 
     double microseconds = [parts[1] doubleValue]; 
     utcDate = [utcDate dateByAddingTimeInterval:microseconds/1000000]; 
    } 
    return utcDate; 
} 

現在一個NSString 「2011-04-21 03:31:37.310396」 將全面解析到一個NSDate 2011-04-21 03 :31:37.310396