2010-01-25 5 views
39

Ich habe einen Countdown-Timer, der vom aktuellen Datum/Uhrzeit zu einem bestimmten zukünftigen Datum/Uhrzeit Countdown. Es funktioniert gut, bis auf ein Problem. Ich gebe das zukünftige Datum mit NSDateFormatter und dateFromString ein. Es scheint nicht in der Lage zu sein, jede Zeit (Stunde) über 12 zu akzeptieren, obwohl es anzeigt, dass es 24 Stunden nicht unterstützt. Gibt es eine Möglichkeit, die 24-Stunden-Uhr-Unterstützung oder eine Problemumgehung zu aktivieren? Hier einige meiner Code:NSDateFormatter mit 24 Stunden Zeiten

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; 
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"]; 

Dank

+0

was ist mit der Lokalisierung ...? hättest du den 'NSDateFormatter' nicht zuerst richtig lokalisiert? – holex

Antwort

63

NSDateFormatter folgt dem Unicode standard for date and time patterns. Verwenden Sie ‚H‘ für die Stunde auf einer 24-Stunden-Uhr:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"]; 
+37

Dies funktioniert nicht, wenn der Benutzer 24 Stunden auf Aus stellt. –

+4

Erstaunlich, nicht wahr? Ich habe gerade festgestellt, dass eine meiner eigenen Anwendungen fehlgeschlagen ist, da die Benutzereinstellung trotz Verwendung von HH in einer Formatzeichenfolge diese Option überschreibt. Verrückt! – Roger

+1

Diese Antwort ist irreführend. Ich stimme Mavrick3 und Roger zu. Die Benutzereinstellung überschreibt die HH des Standardzeitmusters. Die Date Formatters-Dokumentation weist ärgerlich auf dieses Verhalten hin: In allen Fällen sollten Sie berücksichtigen, dass formatters standardmäßig das Gebietsschema des Benutzers (currentLocale) verwendet, das den Voreinstellungen des Benutzers überlagert ist. – user363349

49

Ich hatte das gleiche Problem und mit HH funktionierte nur bei einigen Geräten, wie Roger auch verifiziert. Am Ende war das die Lösung, die für mich funktionierte, ich hoffe, es funktioniert für andere. Diese Antwort war schwierig, es gibt keine Foren, es war buchstäblich Versuch und Irrtum nach der Apple-Dokumentation.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

    [dateFormatter setLocale:enUSPOSIXLocale]; 

    NSString *dateFormat = @"dd/mm/yyyy HH:mm"; 

    [dateFormatter setDateFormat:dateFormat]; 
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
    date = [dateFormatter dateFromString:string]; 
+0

danke, Kumpel. Hat den Trick gemacht. – Felipe

+0

Bis jetzt funktioniert das perfekt. Vielen Dank. – vaticRite

+0

Das sollte als die Antwort markiert werden. Das funktioniert völlig. – aramusss

2

ich vor kurzem hatte ein ähnliches Problem, statt HH, NSDateFormatterhh ignoriert, a (AM/PM Symbol) und G (zyklische Ära Name) in meiner Anwendung.

Und ich war überrascht zu finden, dass, wenn ich zur Lokalisierungseinstellung meines Geräts gehe und eine zufällige Auswahl mache, alle Freaks weg sind und der Fehler nicht erneut erzeugt werden kann. Sehr merkwürdig.

Dann habe ich am Simulator getestet, um einige Studie darüber zu tun. Es ist meine Lösung:

Nachdem Sie die NSDateFormatter erstellt, explizit die locale Eigenschaft auch Sie aktuelle Gebietsschema verwenden, was noch wichtiger ist, verwenden Sie NICHT [NSLocale currentLocale], dieser abgehört wird und irgendwie „überschriebenen“ durch Benutzereinstellung sein , verwenden Sie systemLocale oder erstellen Sie explizit eine NSLocale Instanz, die eine Gebietsschema-ID verwendet.

6

Meine Lösung auf Swift:

let formatter = NSDateFormatter() 
var defIdentifer = formatter.locale.localeIdentifier 
if !defIdentifer.hasSuffix("_POSIX") { 
    defIdentifer = defIdentifer+"_POSIX" 
    let locale = NSLocale(localeIdentifier: defIdentifer) 
    formatter.locale = locale 
} 
formatter.dateFormat = "HH:mm" 
+0

Gute Antwort! Das war, was ich suchte. – Rados

4

vom Apple Technical Q&A auf NSDateFormatters

Q Genommen: Ich NSDateFormatter bin mit einem Internet-Stil Datum zu analysieren, aber dies nicht für einige Benutzer in einige Regionen. Ich habe eine bestimmte Datumsformat-Zeichenfolge festgelegt. sollte das NSDateFormatter nicht zwingen, unabhängig von den Regionseinstellungen des Benutzers zu arbeiten?

A: Nein. Während das Festlegen eines Datumsformatzeichens für die meisten Benutzer funktioniert, ist es nicht die richtige Lösung für dieses Problem. Es gibt viele Stellen, an denen sich Formatzeichenfolgen unerwartet verhalten.

Dies ist, wie ich meine in Swift getan haben:

private let dateFormatter: NSDateFormatter = { 
    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
    dateFormatter.timeZone = NSTimeZone.init(forSecondsFromGMT: 0) 
    return dateFormatter 
}() 
+0

Danke Typ. Es funktioniert sehr gut !!! –

0

Objective C-Version von NSDate von 24-Stunden-String bekommen, wenn der Benutzer 12-Stunden-Format auf ihrem iPhone gesetzt hat, ohne locale zu ändern und Zeitzone einstellen :

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
NSString *localeId = dateFormatter.locale.localeIdentifier; 
if (! [localeId hasSuffix:@"_POSIX"]) { 
    localeId = [localeId stringByAppendingString:@"_POSIX"]; 
    dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:localeId]; 
} 
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH.mm.ss"; 

NSDate *date = [dateFormatter dateFromString:dateText]; 
Verwandte Themen