2013-01-09 11 views
8

La guida Pattern in formato data Unicode (here) indica che aggiungendo un 'a' al formato verrà visualizzato il periodo (AM o PM per esempio), ad esempioVerificare che AM/PM (Period) non compaia in NSDateFormat stringFromDate

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

Tuttavia, desidero garantire che le informazioni sul periodo non vengano visualizzate, ma non riesco a trovare una stringa di formato per farlo. La stringa di formato che sto usando è la seguente:

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

purtroppo, quando uso stringFromDate ricevo il seguente:

2013-01-09T11: 11: 00 AM

I dont desidero semplicemente rimuovere AM o PM dalla stringa risultante perché la sintassi del periodo potrebbe essere diversa in calendari diversi, ecc. Voglio soltanto interrompere la visualizzazione delle informazioni sul periodo.

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

Si consideri il seguente codice

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

Questo codice produrrà una stringa nel formato che voglio - però io non posso usarlo per la memoria ragioni di gestione. L'app a cui sto lavorando è afflitta da perdite di memoria di NSDateFormatter. Quindi usiamo una classe singleton per fornire un numero impostato NSDateFormatters all'app che non vengono mai rilasciati e quindi riduciamo al minimo la quantità di memoria trapelata. Purtroppo questi NSDateFormatters statici sono aggiungendo AM/PM, anche quando applico una stringa di formato data così:

NSDateFormatter *formatter = [MyDateFormatter dateFormat:kFormatDateMediumStyleTimeShortStyle]; 

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

Strano, ti dispiace distacco l'intero metodo in cui questo sta accadendo o un frammento più rilevante se il corpo del metodo è troppo grande? –

+0

Vale la pena mostrare la sottoclasse MyDateFormatter. IE sovrascrive erroneamente 'setDateFormat:' e metodi simili? – vikingosegundo

risposta

0

Ecco la risposta su cui mi sono stabilito. È un po 'semplicistico ma fa il lavoro.

@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

è la data di ritorno di ritorno ?? non la penso così, è solo la rimozione di 'AM/PM' dalla data. –

2

Dipende in realtà su impostazioni dell'utente.

Vedere la parte Fixed Formats della Guida alla formattazione dei dati. Nota questa frase:

In iOS, l'utente può ignorare il default AM/PM in funzione del tempo di 24 ore impostazione. Ciò potrebbe causare NSDateFormatter per riscrivere la stringa di formato impostata.

E alla fine del paragrafo:

La rappresentazione del tempo può essere alle 13:00. In iOS, tuttavia, se l'utente ha impostato il fuso orario su 24 ore, l'ora potrebbe essere 1:00 pm.

+1

notato, grazie: Tuttavia ciò non spiega i due scenari che ho appena evidenziato sopra. Le impostazioni dell'utente non sono state modificate ma si omette AM/PM; uno non è – Damo

0

Un'opzione è creare il proprio NSFormatter. L'ho fatto sul mio codice quando non ho potuto ottenere il formattatore in Interface Builder di Xcode per fare ciò che volevo. Certo, stavo solo cercando ore, minuti e secondi e non la data completa.

Per quanto riguarda le perdite di memoria: se è possibile, utilizzare ARC. Se non è possibile, utilizzare l'analizzatore statico Xcode per cercare di rintracciare i conteggi di conservazione impropri.

1

È necessario utilizzare POSIX qui un codice di esempio

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