2014-05-15 9 views
7

Ich möchte eine NSDateFormatter erstellen, die Daten wie diese "2014-05-13 23: 31: 41.374577" analysieren sollte. Also:NSDateFormatter Millisekunden Bug

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]; 

Allerdings ist die anotherDateString2014-05-13 23:31:41.374000. Warum schneidet es die Millisekunden ab?

+6

Vielleicht hier pingelig, aber es scheint, die Millisekunden zu halten und die Mikrosekunden gestutzt. –

+0

Ist der Fehler in 'dateFromString' oder' stringFromDate'? Hat Ihr '[date timeIntervalSinceReferenceDate]' so viele Dezimalstellen wie Sie erwarten? –

+0

Es scheint, dass '[date timeIntervalSinceReferenceDate]' bereits auf 3 Dezimalstellen gerundet ist ... –

Antwort

13

Es scheint, dass NSDateFormatter funktioniert nur mit Millisekunden-Auflösung, für die aus folgenden Gründen:

  • Durch einen Haltepunkt in CFDateFormatterCreateDateFromString Einstellung kann man sehen, dass diese Funktion von dateFromString: aufgerufen:

    (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 
    
  • CFDateFormatterCreateDateFromString() ist von CFDateFormatter.c , das Open Source ist. Man kann sehen, dass alle kalendarischen Berechnungen unter Verwendung der ICU Calendar Classes gemacht werden.

  • Es wird in calendar.h erklärt, dass CalendarUDate verwendet, die eine Millisekunde Auflösung hat:

    /** 
    * <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.) 
    * ... 
    
+2

Enttäuschendes Ergebnis, aber tolle Antwort. Vielen Dank! –