Formattazione di NSDate in stili particolari per anno, mese, giorno e ora, minuti, secondi


132

Fondamentalmente ho bisogno di ottenere la data e l'ora correnti separatamente, formattate come:

2009-04-26 
11:06:54

Il codice seguente, da un'altra domanda sullo stesso argomento, genera

ora: | 2009-06-01 23:18:23 +0100 | 
dateString: | 01 giu 2009 23: 18 | 
analizzato: | 2009-06-01 23:18:00 +0100 |

Questo è quasi quello che sto cercando, ma voglio separare il giorno e l'ora.

NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"MMM dd, yyyy HH:mm"];

NSDate *now = [[NSDate alloc] init];

NSString *dateString = [format stringFromDate:now];

NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
[inFormat setDateFormat:@"MMM dd, yyyy"];

NSDate *parsed = [inFormat dateFromString:dateString];

NSLog(@"\n"
"now:        |%@| \n"
"dateString: |%@| \n"
"parsed:     |%@|", now, dateString, parsed);

1
In un caso come questo in cui ti sei preso il tempo di scrivere il codice che hai finito per risolvere il problema, probabilmente lo inserirò (in questo caso tutto sotto edit2) in una risposta anziché in una modifica al tuo post. Non è una cosa importante in entrambi i casi, ma rende più facile trovare / vedere che è una soluzione alla domanda.
Lawrence Johnston,

Risposte:


72

Le stringhe in formato iPhone sono in formato Unicode . Dietro il link c'è una tabella che spiega cosa significano tutte le lettere sopra in modo da poter costruire le tue.

E ovviamente non dimenticare di rilasciare i tuoi formattatori di date quando hai finito con loro. Il codice sopra perdite format, nowe inFormat.


Perdita anche con ARC attivato?
Dimme,

19
Quanto sopra non avrà perdite sotto ARC (ovviamente ARC non era disponibile nel 2009 quando stavamo discutendo).
Rob Napier,

194

questo è quello che ho usato:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd"];

NSDateFormatter *timeFormat = [[NSDateFormatter alloc] init];
[timeFormat setDateFormat:@"HH:mm:ss"];

NSDate *now = [[NSDate alloc] init];

NSString *theDate = [dateFormat stringFromDate:now];
NSString *theTime = [timeFormat stringFromDate:now];

NSLog(@"\n"
      "theDate: |%@| \n"
      "theTime: |%@| \n"
      , theDate, theTime);

[dateFormat release];
[timeFormat release];
[now release];

12

puoi usare questo metodo semplicemente passandoci la data

-(NSString *)getDateFromString:(NSString *)string
{

    NSString * dateString = [NSString stringWithFormat: @"%@",string];

    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"your current date format"];
    NSDate* myDate = [dateFormatter dateFromString:dateString];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"your desired format"];
    NSString *stringFromDate = [formatter stringFromDate:myDate];

    NSLog(@"%@", stringFromDate);
    return stringFromDate;
}

11
    NSDateFormatter *dateformat = [[NSDateFormatter alloc] init];
    [dateformat setDateFormat:@"Your Date Format"];

impostare il formato per tornare è ....

yyyy-MM-dd2015-12-17data di ritorno

yyyy-MMM-dd2015-Dec-17data di ritorno

yy-MM-dd15-12-17data di ritorno

dd-MM-yy17-12-15data di ritorno

dd-MM-yyyy17-12-2015data di ritorno

yyyy-MMM-dd HH:mm:ss2015-Dec-17 08:07:13data e ora di ritorno

yyyy-MMM-dd HH:mm2015-Dec-17 08:07data e ora di ritorno

Per ulteriori dettagli Dati e formato ora per Fare clic ora.

Grazie.....


1
Fornisci una descrizione aggiuntiva insieme all'esempio di codice.
Maciej Lach,

Ho questa data '2018-06-08T07: 30: 05.391Z' ho provato 'yyyy-MM-dd'T'HH: mm: ss.000Z' ma ho ottenuto un valore nullo.
Pramod Tapaniya,

4

niente di nuovo ma voglio ancora condividere il mio metodo:

+(NSString*) getDateStringFromSrcFormat:(NSString *) srcFormat destFormat:(NSString *)
destFormat scrString:(NSString *) srcString
{
    NSString *dateString = srcString;
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    //[dateFormatter setDateFormat:@"MM-dd-yyyy"];
    [dateFormatter setDateFormat:srcFormat];
    NSDate *date = [dateFormatter dateFromString:dateString];

    // Convert date object into desired format
    //[dateFormatter setDateFormat:@"yyyy-MM-dd"];
    [dateFormatter setDateFormat:destFormat];
    NSString *newDateString = [dateFormatter stringFromDate:date];
    return newDateString;
}

3

Per veloce

var dateString:String = "2014-05-20";
var dateFmt = NSDateFormatter()
// the format you want
dateFmt.dateFormat = "yyyy-MM-dd"
var date1:NSDate = dateFmt.dateFromString(dateString)!;

0

Swift 3

extension Date {
    
    func toString(template: String) -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: template, options: 0, locale: NSLocale.current)
        return formatter.string(from: self)
    }
    
}

uso

let now = Date()
let nowStr0 = now.toString(template: "EEEEdMMM") // Tuesday, May 9
let nowStr1 = now.toString(template: "yyyy-MM-dd") // 2017-05-09
let nowStr2 = now.toString(template: "HH:mm:ss") // 17:47:09

Gioca con il modello per soddisfare le tue esigenze. Esempi e documenti qui per aiutarti a costruire il modello che ti serve.

Nota

Potresti voler memorizzare nella cache DateFormatterse hai intenzione di usarlo TableViewper esempio. Per dare un'idea, il ciclo di oltre 1000 date mi ha richiesto 0,5 secondi usando la toString(template: String)funzione sopra , rispetto a 0,05 secondi usando myFormatter.string(from: Date).


Per rendere più forte quella nota (perché è molto importante) puoi refactificare la tua funzione per prendere un parametro opzionale con un valore predefinito della nuova istanza. Non so perché sei stato sottratto, quindi lo sto votando.
Vive il

-6
NSDate *date         = [NSDate date];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd"]
NSString *dateString  = [df stringFromDate:date];
[df setDateFormat:@"hh:mm:ss"];
NSString *hoursString = [df stringFromDate:date];

Questo è tutto, hai tutto quello che vuoi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.