Frage

Ich versuche, das Datum in einem bestimmten Format auszudrucken:

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 gesetzt, das funktioniert gut, wenn auf der anderen Seite der Benutzer es bis zu 24 Stunden Zeit gesetzt hat, dann wieder auf AM / PM (es funktioniert gut, bis Sie diese Einstellung umschalten) dann anhängt die aM / PM am Ende, obwohl ich nicht für sich fragte:

20080927030337 PM

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

Edit 1: Aus Beschreibung klarer

Edit 2 Abhilfe: Es stellt sich heraus, das ein Fehler ist, um es zu beheben stelle ich die AM- und PM-Zeichen „“:

[dateFormatter setAMSymbol:@""];
[dateFormatter setPMSymbol:@""];
War es hilfreich?

Lösung

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

Tun Sie etwas anderes mit dateStr, die Sie nicht hier posten habe? Wie werden Sie den Wert überprüfen?

Follow-up

  

Versuchen Sie, die am / pm Einstellung Einschalten dann aus. Ich habe das Problem auch nicht, bis ich das tat. Ich drucke es die gleiche Art und Weise heraus Sie sind.

Okay, ich sehe es, wenn ich dies auch tun. Es muss ein Fehler sein. Ich empfehle Ihnen, einen Fehlerbericht Datei und überprüfen Sie nur für und filtern die unerwünschten Zeichen in der Zwischenzeit aus.

Andere Tipps

Der Grund für dieses Verhalten ist Locale, setzt sich die richtigen Locale.

Stellen Sie die lokale Ihrer NSDateFormatter en_US_POSIX wird dieses Problem beheben. Es funktioniert sowohl 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

Versuchen Sie dies,

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

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 das iPhone   Benutzer ändern ihre Region Format zwischen, sagen wir, „Vereinigte Staaten“ und   „Frankreich“, der Benutzer ‚24-Stunden-Time‘ Einstellung automatisch umgeschaltet wird,   auf den Modus, die am häufigsten in dieser Region ist. In Frankreich, dass   würde Satz 24-Stunden-Zeit auf „ON“, und in den USA, dass es einrichten würde   "AUS". Die Benutzer können dann manuell überschreiben diese Einstellung und das ist   wo Probleme beginnen.

     

Das Problem kommt von NSDateFormatter irgendwie „stecken zu bleiben“ in der   12 oder 24-Stunden-Zeitmodus, den der Benutzer manuell ausgewählt hat. Wenn also ein   Französisch Benutzer wählt manuell 12-Stunden-Modus, und die Anwendung   NSDateFormatter zur Ausgabezeit angefordert mit dem 24-Stunden-Format   „Hhmm“, wäre es eigentlich Zeit in einem 12-Stunden-Format empfängt, zum Beispiel   „01.00“, als ob die Anwendung stattdessen „hhmm aa“ gebeten hatte.   Die umgekehrte passieren würde, wenn ein US-Benutzer manuell 24-Stunden-Modus ausgewählt:   Zeit mit dem 12-Stunden-Format „hhmm aa“ tatsächlich bekommen würde ausgibt   Sie Zeit in dem 24-Stunden-Format statt, z.B. „17.00 Uhr".

Weitere Details und eine mögliche Abhilfe können auf diese Blog .

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, den Kalender, wenn das Hinzufügen ist auch erforderlich, aber das funktioniert gut.

Ich 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!

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

Dies sollte auch funktionieren (ich einige bizzare Ergebnisse sehe 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];
}

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

Es war ein frustrierendes Thema, weil so viele Websites, stundenlang zu verwenden HH anzuzeigen (einschließlich der offiziellen Apple-Dokumentation), aber das setzt es bis zu 24-Stunden-Format, während hh 12 Stunden-Format verwendet. Siehe http://unicode.org/reports/tr35/tr35-6.html# Date_Format_Patterns für weitere Details.

Als Bonus beachten Sie, dass Sie auch KK oder kk für Stunde des Tages-Format verwenden können, die aus wahrscheinlich durch sein wird.

Update: Ich war auf der Suche vor kurzem bei NSLocale (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSLocale_Class/Reference/Reference.html) und es scheint, dass Sie autoupdatingCurrentLocale verwenden können, um gelten innerhalb der App auf die Locale vorgenommenen Änderungen. Das Ergebnis davon ist, dass auch wenn das Telefon eingestellt ist, ein 24-Stunden-Format verwenden (wie wenn man nach Frankreich eingeschaltet), können Sie einen 12/24 Knebel für die App machen, die keine andere Anwendungen auf dem Handy auswirken werden, oder benötigen Sie die App verlassen, um die Änderung vorzunehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top