NSDateFormatter - nicht respektiert, 12/24-Stunden - (am/pm) - system eingestellt, in einigen Fällen
Möchte ich ein Datum ausgeben (mit relativen Datumsangaben, z.B. Heute, Gestern etc.) und Zeit (Einhaltung der 12/24-Stunden-Einstellung auf dem iOS-Gerät) E.-g.
- Heute 5:48 PM (wenn im 12-Stunden-Modus); und
- Heute 17:48 (im 24 Stunden-Modus)
Konfigurieren eines NSFormatter wie diese (und mit stringFromDate:) funktioniert nicht:
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale: [NSLocale autoupdatingCurrentLocale]];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; //doesn't respect am/pm setting on iOS device (grrr!)
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setDoesRelativeDateFormatting:YES]; //but does get relative dates
Diese erhalten Sie relative Daten, sondern standardmäßig an der 12/24-Einstellung für das Gebietsschema, z.B. 12 Stunden für UNS und 24 Stunden für Großbritannien. (Warum Apple denke, UK Volk wie 24 Stunden Uhren, weiß ich nicht...)
Einer umgehen, habe ich angenommen, verwendet zwei NSDateFormatters, eine für das Datum und eins für die Zeit. Es scheint, dass, wenn Sie konfigurieren ein NSDateFormatter mit einem dateStyle von NSDateFormatterNoStyle und timeStyle von NSDateFormatterShortStyle, dann hat es respektiert die 12/24-Stunden-Einstellung. (Es geht also nur, wenn Sie SOWOHL Datum und Uhrzeit-Formatvorlagen einstellen, dass es ärger gibt.)
Habe ich meine Arbeit um unten Fall hat jemand ein ähnliches Problem. Gibt es ein einfacher Weg, dies zu tun? Die Arbeit scheint etwas umständlich und es ist nicht klar, wie zuversichtlich ich sein sollte, wird es weiterhin arbeiten in zukünftigen Versionen von iOS.
Umgehen
- (NSString*) humanRelativeDateAndTimeAlt: (NSDate*) date;
{
NSDateFormatter* relativeDateFormatter = [[NSDateFormatter alloc] init];
[relativeDateFormatter setLocale: [NSLocale autoupdatingCurrentLocale]];
[relativeDateFormatter setTimeStyle:NSDateFormatterNoStyle]; //no time for this formatter
[relativeDateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setDoesRelativeDateFormatting:YES]; //relative dates
NSString* datePart = [[self relativeDateFormatter] stringFromDate:date];
NSDateFormatter* timeDateFormatter = [[NSDateFormatter alloc] init];
[timeDateFormatter setLocale:[NSLocale autoupdatingCurrentLocale]];
[timeDateFormatter setDateStyle: NSDateFormatterNoStyle]; //no date for this formatter
[timeDateFormatter setTimeStyle: NSDateFormatterShortStyle]; //does respect 12/24 hour setting
NSString* timePart = [timeDateFormatter stringFromDate:date];
int skipZero = 0; //extra code to remove leading zero if present
if ([[timePart substringToIndex:1] isEqualToString:@"0"]) skipZero = 1;
[relativeDateFormater release];
[timeDateFormatter release];
return [NSString stringWithFormat:@"%@ %@", datePart, [timePart substringFromIndex:skipZero]];
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Grund für dieses Verhalten ist Locale, stellen Sie die korrekte Ländereinstellung, Festlegen der lokalen Ihrer NSDateFormatter zu en_US_POSIX wird dieses Problem beheben.
Es funktioniert für 24-Stunden-und 12-Stunden-format.
Vom Apple doc:
Referenz: Was ist der beste Weg, um mit dem NSDateFormatter locale "feature"?
Ich habe laufen in das gleiche Problem. Ich habe Sie aufgezogen wie ein Fehler mit Apple, und veröffentlicht Sie auf Open Radar:
http://openradar.appspot.com/9774877
Fand ich diese Lösung :
Fest, dass 2 meiner Probleme :
Ich hatte ein ähnliches Problem, was ich am Ende tun war, ammend die dateFormat, anstatt die Angabe der timeStyle.
Funktionierte gut für mich, hoffe es hilft.
Verwenden Sie dieses format,
Beispiel: [NSDate date] ist 2017-05-14 12:40:00
Für Heute | Gestern ich benutze NSDateComponents für die Berechnung und Rückgaberecht Datum.