2008-09-27 12 views
37

Ich versuche, das Datum in einem bestimmten Format auszudrucken:NSDateFormatter, mache ich etwas falsch oder ist das ein Fehler?

NSDate *today = [[NSDate alloc] init]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"]; 
NSString *dateStr = [dateFormatter stringFromDate:today]; 

Wenn das iPhone bis 24 Stunden-Zeit eingestellt ist, funktioniert dies gut, wenn auf der anderen Seite der Benutzer es bis zu 24 Stunde eingestellt haben Zeit, dann wieder auf aM/PM (es funktioniert gut, bis Sie diese Einstellung umzuschalten), dann hängt es die aM/PM am Ende, obwohl ich nicht für sie fragte:

20080927030337 PM 

bin ich etwas falsch machen oder ist das ein Bug mit Firmware 2.1?

Edit 1: Made Beschreibung klarer

Edit 2 Abhilfe: Es stellt sich heraus, das ein Fehler ist, zu fixieren ich das AM- und PM-Zeichen auf "":

[dateFormatter setAMSymbol:@""]; 
[dateFormatter setPMSymbol:@""]; 
+1

genau das gleiche Problem bekommen - zu sehen, dass ich werde verrückt nicht! –

+0

Nur eine Anmerkung, wenn Sie die setAM/PM-Methoden verwenden, wird immer noch ein zusätzliches Leerzeichen in der Zeichenfolge sein. – conor

Antwort

12

den Code verwenden Sie beide gebucht auf dem Simulator und ein Telefon mit der 2.1 Firmware und 24-Stunden-Zeit ausgeschaltet, ich hatte nie eine aM/PM zu dateStr angehängt, wenn ich tun:

NSLog(@"%@", dateStr); 

Sind Sie etwas anderes mit d tun ateStr, die du hier nicht gepostet hast? Wie überprüfen Sie den Wert?

Follow-up

Versuchen Sie, die am/pm Einstellung Einschalten dann aus. Ich hatte auch kein Problem, bis ich das tat. Ich drucke es genauso aus wie du bist.

Okay, ich sehe es, wenn ich das auch mache. Es muss ein Fehler sein. Ich empfehle Ihnen file a bug report und suchen Sie in der Zwischenzeit nur nach unerwünschten Zeichen.

+0

versuchen Sie, die Einstellung für am/pm einzuschalten und dann auszuschalten. Ich hatte auch kein Problem, bis ich das tat. Ich drucke es genauso aus wie du bist. – rustyshelf

+0

Diese Antwort ist nicht die Lösung - Huyz Antwort richtig beantwortet dies - es ist ein Fehler mit NSDateFormatter – earnshavian

14

Hier ist die Erklärung der iPhone SDK Fehler (auch noch in 3.1 Beta SDK)

Zuerst ein wenig Hintergrund auf dem iPhone-Benutzeroberfläche. Wenn iPhone-Benutzer das Regionalformat zwischen "Vereinigte Staaten" und "Frankreich" ändern, wird die Einstellung "24-Stunden-Zeit" der Benutzer automatisch auf den Modus umgeschaltet, der in dieser Region am häufigsten vorkommt. In Frankreich würde diese die 24-Stunden-Zeit auf "EIN" setzen, und in den USA würde sie dies auf "AUS" setzen. Die Benutzer können diese Einstellung dann manuell überschreiben, und das ist , wo der Fehler beginnt.

Das Problem kommt von NSDateFormatter irgendwie "stecken geblieben" im 12 oder 24-Stunden-Zeit-Modus, den der Benutzer manuell ausgewählt hat. Wenn also ein französischer Benutzer den 12-Stunden-Modus manuell auswählt und die Anwendung NSDateFormatter anfordert, um die Zeit mit dem 24-Stunden-Format "HHmm" auszugeben, erhält sie tatsächlich Zeit in einem 12-Stunden-Format, z. "01:00 PM", als hätte die Anwendung stattdessen "hhmm aa" angefordert. Das Umgekehrte würde passieren, wenn ein US-Benutzer manuell 24-Stunden-Modus wählen würde: Ausgabezeit mit dem 12-Stunden-Format "hhmm aa" würde stattdessen Sie Zeit im 24-Stunden-Format statt, z. "17:00 Uhr"

Weitere Details und eine mögliche Problemumgehung finden Sie unter blog.

+0

Filed einen Fehler: http://openradar.appspot.com/radar?id=1110403 –

+3

Ich habe dies auf einem Testgerät bestätigt. Ändern Sie die internationale Einstellung in Großbritannien.Legen Sie Datum und Uhrzeit 24 Stunden Zeit fest, um sie in Ihren Apps zu reproduzieren. Umgehung für mich war @DenNukem-Antwort unten Einstellung von Gebietsschema zu en_US für den Datumsformatierer. – earnshavian

+0

@earnshavian du hast mein Leben gerettet !! Mein Kunde ist kürzlich auf dieses Problem gestoßen, das ich nicht reproduzieren kann, weil ich die US-Region benutzt habe! Ich habe versucht, in andere Regionen zu gehen, die alle gut funktionierten, bis ich deinen Kommentar sah, es war die britische Region, die das Problem verursacht hat. Danke vielmals! – user3162662

1

Für diejenigen, diese Frage zu finden, die NSDateFormatter verwenden möchten 24-Stunden-Zeit zu analysieren und diesen Fehler schlagen, NSDateComponents mit Daten und Zeiten zu analysieren, die ein bekanntes Format haben ausweicht dieses Problem:

NSString *dateStr = @"2010-07-05"; 
NSString *timeStr = @"13:30"; 

NSDateComponents *components = [[NSDateComponents alloc] init]; 
components.year = [[dateStr substringToIndex:4] intValue]; 
components.month = [[dateStr substringWithRange:NSMakeRange(5, 2)] intValue]; 
components.day = [[dateStr substringFromIndex:8] intValue]; 
components.hour = [[timeStr substringToIndex:2] intValue]; 
components.minute = [[timeStr substringFromIndex:3] intValue]; 

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDate *date = [calendar dateFromComponents:components]; 

[components release]; 
[calendar release]; 
4

I denke, das ist die Lösung.

NSDateFormatter *df =[[NSDateFormatter alloc] init]; 
     [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
     NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 

[df setLocale: usLocale]; 

[usLocale release]; 

NSDate *documento_en_Linea =[[[NSDate alloc] init]autorelease]; 

documento_en_Linea=[df dateFromString:@"2010-07-16 21:40:33"]; 

[df release]; 

     NSLog(@"fdocumentoenLineaUTC:%@!",documento_en_Linea); 


//ouput 
    fdocumentoenLineaUTC:2010-07-16 09:40:33 p.m. -0500! 
0

Dies sollte auch funktionieren (ich sehe einige bizzare Ergebnisse obwohl).

-(NSString*)lowLevTime:(NSString*)stringFormat { 
    char buffer[50]; 
    const char *format = [stringFormat UTF8String]; 
    time_t rawtime; 
    struct tm * timeinfo; 
    time(&rawtime); 
    timeinfo = localtime(&rawtime); 
    strftime(buffer, sizeof(buffer), format, timeinfo); 
    return [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding]; 
} 
9

Einstellung locale auf Datum Formatierer en_US behebt das Problem für mich:

NSDateFormatter * f = [[NSDateFormatter alloc] init]; 
    [f setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; 
    f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 
    f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
    f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 

Ich bin nicht sicher, ob der Kalender hinzugefügt wird auch benötigt, aber das funktioniert gut.

+0

Ich habe den Kalender nicht geändert, und nachdem ich meine Operationen ausgeführt hatte, wollte ich den Datumsformatierer wieder in das Gebietsschema des Benutzers ändern, also tat ich f.locale = [NSLocale currentLocale]. Das hat für mich funktioniert. – arlomedia

+0

Danke, das hat für mich funktioniert –

0

Kurze Antwort: versuchen Sie [dateFormatter setDateFormat:@"yyyyMMddhhmmss"]; für 12-Stunden-Format (beachten Sie die Kleinbuchstaben hh).

Es ist ein frustrierendes Thema gewesen, weil so viele Websites zeigen HH stundenlang zu verwenden (einschließlich der offiziellen Apple-Dokumentation), aber das setzt es bis zu 24-Stunden-Format, während hh 12 Stunden-Format verwendet. Weitere Informationen finden Sie unter http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns.

Als Bonus, beachten Sie, dass Sie auch KK oder kk für die Stunde des Tages-Format verwenden können, die wahrscheinlich um eins deaktiviert ist.

Update: ich vor kurzem wurde bei NSLocale suchen (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html) und es würde Anscheinend können Sie autoupdatingCurrentLocale verwenden, um Änderungen, die in der App vorgenommen wurden, auf das Gebietsschema anzuwenden. Das Ergebnis davon ist, dass selbst wenn das Telefon auf eine 24-Stunden-Uhr eingestellt ist (z. B. wenn Sie nach Frankreich gewechselt haben), Sie eine 12/24-Umschaltung für die App vornehmen können, die keine anderen Apps auf dem Telefon beeinflusst. Oder Sie müssen die App verlassen, um die Änderung vorzunehmen.

25

Der Grund für dieses Verhalten Locale ist, stellen Sie die richtigen Locale, Stellen Sie die lokalen Ihren NSDateFormatter zu en_US_POSIX wird dieses Problem beheben. Es funktioniert für 24-Stunden- und 12-Stunden-Format.

On iPhone OS, the user can override the default AM/PM versus 24-hour time setting (via Settings > General > Date & Time > 24-Hour Time), which causes NSDateFormatter to rewrite the format string you set. Von apple doc

diese

Versuchen,

NSDate *today = [[NSDate alloc] init]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"]; 
NSString *dateStr = [dateFormatter stringFromDate:today]; 
+1

Danke. Ich verbrachte 5 volle Stunden, um dies zu begegnen, und weil es mir immer eine Zeitformat-Zeichenkette mit "a.m/p.m" gibt, die verursacht, dass meine API-Anforderung wegen & timeRequest Zeichenfolge-Wert mit Platz fehlschlägt! – felixwcf