2009-08-28 13 views
12

Sto utilizzando NSDateFormatter per impostare la data nell'app per iPhone e le date sono visualizzate correttamente. Tuttavia, sto trovando tutte le impostazioni locali (la mia app supporta fino a 12 lingue diverse) si attengono al formato della data che specifica tramite setDateFormat. Idealmente, voglio che il formato della data appaia in una forma naturale rispetto all'impostazione della regione per l'utente, invece di seguire il mio formato (che funziona bene per l'inglese ma potrebbe non essere naturale per altre impostazioni locali).Come rendere NSDateFormatter visualizzare la data specifica della locale?

seguito è il mio codice:

 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
    [dateFormatter setDateFormat:@"MMMM dd, yyyy kk:mm:ss"]; 

    self.creationDate.text = [dateFormatter stringFromDate:creationTimeStamp]; 

risposta

11

Trovato la soluzione. La chiave è di non chiamare affatto setDateFormat e l'API in iPhone seleziona automaticamente la cosa appropriata da visualizzare in base a quanto specificato in setDateStyle e setTimeStyle.

+0

Questa soluzione è migliore dell'utilizzo dell'API localizedStringFromDate perché la stringa restituita da -localizedStringFromDate neutralizzerà il fattore di fuso orario e talvolta, in alcune regioni, la data/l'ora saranno irrilevanti. Per rimuovere il componente del fuso orario, dobbiamo farlo in aggiunta: [dateFormatter setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT: 0]]; –

31

vorrei provare il NSDateFormatter API seguente invece:

+ (NSString *)localizedStringFromDate:(NSDate *)date 
       dateStyle:(NSDateFormatterStyle)dateStyle 
       timeStyle:(NSDateFormatterStyle)timeStyle; 

Come così:

self.creationDate.text = [NSDateFormatter localizedStringFromDate:creationTimeStamp 
              dateStyle:NSDateFormatterMediumStyle 
              timeStyle:NSDateFormatterShortStyle]; 

Questo dovrebbe darvi l'output si' stai cercando, riordina un po 'il codice e ti impedisco di dover gestire qualche memoria spuria.

+0

Ma cosa succede se io non voglio per lo stile con gli stili date. Invece, voglio mostrare una data come: MMM YYYY in arabo e inglese. Puoi per favore aiutare? –

0

soluzione Self-contained con un design di @ fbrereto:

static NSString *FormatDate(NSDate *date) 
{ 
    return [NSDateFormatter localizedStringFromDate:date 
             dateStyle:NSDateFormatterMediumStyle 
             timeStyle:NSDateFormatterNoStyle]; 
} 

Ora si può semplicemente eseguire:

NSString *formattedDate = FormatDate([NSDate new]); 
+0

NSDateFormatter è piuttosto costoso da creare (vedere il post Bekkis: http://www.tinymission.com/post/nsdateformatter_is_expensive). Quindi dovresti usare questa soluzione autonoma solo quando viene chiamata solo per pochissime volte. Forse il NSDateFormatter usato dovrebbe essere assegnato pigramente in una variabile statica. – LaborEtArs

+0

Un buon punto, si potrebbe anche passare in _dateFormatter alla funzione static-c dall'alto, e mantenere un riferimento ad esso dal consumatore. – Zorayr

Problemi correlati