2013-01-09 3 views
8

Das Handbuch Unicode Date Format Patterns (here) besagt, dass das Anhängen eines "a" an das Format die Periode (AM oder PM zum Beispiel) erhält, zBStellen Sie sicher, dass AM/PM (Periode) nicht in NSDateFormat stringFromDate erscheint

[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss a"]; 

Allerdings möchte ich sicherstellen, dass die Periodeninformationen nicht angezeigt werden, aber ich finde keine Formatzeichenfolge, um das zu tun. Der Formatstring ich verwende ist wie folgt:

[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"]; 

leider, wenn ich stringFromDate verwende ich folgendes erhalten:

2013-01-09T11: 11: 00 AM

ich nicht Ich möchte einfach AM oder PM aus der resultierenden Zeichenfolge streichen, da die Periodensyntax in verschiedenen Kalendern usw. unterschiedlich sein kann. Ich möchte nur die erscheinende Periodeninformation stoppen.

---- 8 < ------

Betrachten Sie den folgenden Code

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setLocale:[NSLocale currentLocale]]; 
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"]; 
NSString *stringDate = [formatter stringFromDate:[NSDate date]]; 

self.labelOutput.text = stringDate; 

[formatter release]; 

Dieser Code wird eine Zeichenfolge im Format produzieren ich will - aber ich kann es nicht für Speicher verwenden können, Management Gründe. Die App, an der ich arbeite, wird von NSDateFormatter-Speicherlecks geplagt. Daher verwenden wir eine Singleton-Klasse, um der App eine Set-Nummer NSDateFormatters zu geben, die niemals freigegeben wird, und deshalb minimieren wir, wie viel Speicher geleakt wird. Leider kommt auch diese statische NSDateFormatters anfügen AM/PM, wenn ich so ein Datumsformat String gelten:

NSDateFormatter *formatter = [MyDateFormatter dateFormat:kFormatDateMediumStyleTimeShortStyle]; 

[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"]; 
+0

Odd, stört es Sie, das gesamte Verfahren zu veröffentlichen, wo dies geschieht oder ein relevanter Schnipsel, wenn die Methode Körper zu groß ist? –

+0

Es würde sich lohnen, die Unterklasse MyDateFormatter anzuzeigen. IE überschreibt es falsch 'setDateFormat:' und ähnliche Methoden? – vikingosegundo

Antwort

0

Hier ist die Antwort, auf die ich mich festgelegt habe. Es ist ein bisschen zu einfach, aber es macht den Job.

@interface NSDateFormatter (Utils) 

- (NSString *)stringWithNoPeriodInformationFromDate:(NSDate*)date; 

@end 

@implementation NSDateFormatter (Utils) 

- (NSString *)stringWithNoPeriodInformationFromDate:(NSDate*)date 
{ 
    NSString *stringWithPotentialPeriodInformation = [self stringFromDate:date]; 
    NSString *stringWithNoAMInformation = [stringWithPotentialPeriodInformation stringByReplacingOccurrencesOfString:[self AMSymbol] withString:@""]; 
    NSString *stringWithNoPeriodInformation = [stringWithNoAMInformation stringByReplacingOccurrencesOfString:[self PMSymbol] withString:@""]; 

    return stringWithNoPeriodInformation; 
} 

@end 
+0

ist es zurück, aktuelle Datum? Ich denke nicht, es ist nur entfernen "AM/PM" von Datum. –

2

Es hängt wirklich von Benutzer-Einstellungen.

Bitte lesen Sie Fixed Formats Teil der Datenformatierungshilfe. Beachten Sie diesen Satz:

In iOS, kann der Benutzer außer Kraft setzt den Standard-AM/PM im Vergleich zu 24-Stunden- Einstellung. Dies kann dazu führen, dass NSDateFormatter die von Ihnen festgelegte Formatzeichenfolge neu schreibt.

Und am Ende des Absatzes:

Die Darstellung der Zeit 13.00 Uhr sein. In iOS, jedoch , wenn der Benutzer 24-Stunden-Zeit auf Aus geschaltet hat, kann die Uhrzeit 13:00 Uhr sein.

+1

vermerkt, danke: Allerdings erklärt das nicht die zwei Szenarien, die ich gerade oben hervorgehoben habe. Die Benutzereinstellungen wurden nicht geändert, aber einer enthält AM/PM; man nicht – Damo

0

Eine Möglichkeit besteht darin, einen eigenen NSFormatter zu erstellen. Ich habe das mit meinem Code gemacht, als ich den Formatierer in Xcode's Interface Builder nicht dazu bringen konnte, das zu tun, was ich wollte. Zugegeben, ich habe nur nach Stunden, Minuten und Sekunden gesucht und nicht nach dem vollen Datum.

Wie für die Speicherlecks: Wenn Sie können, verwenden Sie ARC. Wenn dies nicht möglich ist, versuchen Sie mit dem Static Analyzer von Xcode, unkorrekte Retain-Zählungen aufzuspüren.

1

Sie müssen POSIX verwenden hier einen Beispielcode

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

     [rfc3339DateFormatter setLocale:enUSPOSIXLocale]; 
     [rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 
     [rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

     // Convert the RFC 3339 date time string to an NSDate. 
     NSDate *date = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString]; 
Verwandte Themen