NSDateFormatter毫秒bug

xis*_*urg 10 nsdateformatter ios

我想创建一个NSDateFormatter来解析像这样的日期"2014-05-13 23:31:41.374577".所以:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSSSSS";
NSString *dateString = @"2014-05-13 23:31:41.374577";
NSDate *date = [formatter dateFromString:dateString];
NSString *anotherDateString = [formatter stringFromDate:date];
Run Code Online (Sandbox Code Playgroud)

但是,anotherDateString是的2014-05-13 23:31:41.374000.为什么它会截断毫秒?

Mar*_*n R 16

NSDateFormatter由于以下原因,它似乎仅以毫秒分辨率工作:

  • 通过设置断点CFDateFormatterCreateDateFromString,可以看到从dateFromString:以下位置调用此函数:

    (lldb) bt
    * thread #1: tid = 0x26d03f, 0x018f47d0 CoreFoundation`CFDateFormatterCreateDateFromString, queue = 'com.apple.main-thread', stop reason = breakpoint 3.1
        frame #0: 0x018f47d0 CoreFoundation`CFDateFormatterCreateDateFromString
        frame #1: 0x0116e0ea Foundation`getObjectValue + 248
        frame #2: 0x0116dfc7 Foundation`-[NSDateFormatter getObjectValue:forString:errorDescription:] + 206
        frame #3: 0x0116879f Foundation`-[NSDateFormatter dateFromString:] + 71
      * frame #4: 0x00002d56 foo`main(argc=1, argv=0xbfffee54) + 182 at main.mm:25
    
    Run Code Online (Sandbox Code Playgroud)
  • CFDateFormatterCreateDateFromString()来自 CFDateFormatter.c ,它是开源的.可以看到所有日历计算都是使用 ICU日历类进行的.

  • calendar.h中声明Calendar使用UDate具有毫秒分辨率的:

    /**
     * <code>Calendar</code> is an abstract base class for converting between
     * a <code>UDate</code> object and a set of integer fields such as
     * <code>YEAR</code>, <code>MONTH</code>, <code>DAY</code>, <code>HOUR</code>,
     * and so on. (A <code>UDate</code> object represents a specific instant in
     * time with millisecond precision. See UDate
     * for information about the <code>UDate</code> class.)
     * ...
    
    Run Code Online (Sandbox Code Playgroud)

  • 令人失望的结果,但很棒的答案.谢谢! (5认同)