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]];
}
InformationsquelleAutor Obliquely | 2011-05-29
Schreibe einen Kommentar