2011-04-21 59 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