2009-08-30 10 views
38

ho ricevuto una stringa che contiene la data corrente utilizzando questo:NSString a NSDate

NSString *date = [[NSDate date] description]; 

in un punto diverso che voglio recuperare la data da questa stringa e ho usato il seguente codice:

[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
//[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehaviorDefault]; 
[dateFormatter setDateFormat:@"YYYY-MM-DD HH:MM:SS ±HHMM"]; 

NSDate *dateFromString = [[NSDate alloc] init]; 
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; 

Mi sto ottenendo dateFromString come nil 0x0. Che cosa sto facendo di sbagliato?

risposta

64

Non è possibile inventare la sintassi della stringa di formato e aspettarsi che funzioni; è necessario utilizzare effettivamente un formato documentato. (Seriamente, "MM" significa "mese", "minuti" e "minuti di offset GMT" tutti allo stesso tempo?)

Come il documentation indica, i 10.4 i formattatori utilizzano Unicode format strings.

Provare "aaaa-MM-gg HH: mm: ss ZZZ".

Inoltre, la sorgente Objective-C è ASCII. Non mettere caratteri come ± dentro e aspettarti che funzioni in qualsiasi contesto; invece, usa i file di stringhe.

+1

Funziona bene – Minar

+0

Unicode UTF-8 funziona perfettamente nella fonte. – Jonny

+1

Questo è cambiato con il passaggio a compilatori più recenti da quando ho scritto la mia risposta originale (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/CreatingStrings.html#//apple_ref/doc/ uid/20000148-SW1). –

7

Inoltre, dateFromString: restituisce un NSDate autoreleased, quindi:

NSDate *dateFromString = [[NSDate alloc] init]; // <- non freed instance 
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; // <- new autoreleased instance 
.... 
[dateFromString release]; // <- wrong 

Si consiglia di:

//NSDate *dateFromString = [[NSDate alloc] init]; 
NSDate *dateFromString = [dateFormatter dateFromString:<NSString containing date>]; 
.... 
//[dateFromString release]; // dateFromString is autoreleased 

Spero che questo potrebbe salvare qualcuno :)

+0

che cos'è dateFormatter? –

+0

Dalla domanda stessa: NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; – grilix

-1

Come già risposto, che è quello che succede quando inventi una nuova sillaba.

Sulla base di Apple NSDateFormatter Class Reference documentazione

Ci sono molti attributi che si possono ottenere e impostare una data stile formattatore, ... siete invitati, tuttavia, non modificare le singole impostazioni . Invece si dovrebbe accettare le impostazioni predefinite stabiliti inizializzazione e specificare il formato utilizzando setDateStyle :, setTimeStyle:

Questo è particolarmente importante per l'uscita, che è diverso per ogni locale. Per impostazione predefinita NSDateFormatter osserva le impostazioni locali dell'utente corrente. Quindi lo stesso NSDate potrebbe essere 22.11.2011 18:33:19 o Nov 22, 2011 6:33:19 PM o 2011-11-22 下午6:33:19 o anche २२-११-२०११ ६:३३:१९ अपराह्, tutti per lo stesso input e con lo stesso codice.

Consideriamo per esempio questo codice

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

// ShortStyle used: 11/23/37 3:30pm 
NSString *dateString = [dateFormatter stringFromDate:date]; 

Controllate la documentazione di Apple per i diversi stili di NSDateFormatterStyle o questo excellent tutorial

2

Si potrebbe verificare TouchTime.

https://github.com/jheising/TouchTime.

È una porta diretta della fantastica funzione strtotime in PHP in 5.4 per Cocoa e iOS. Prenderà praticamente qualsiasi formato arbitrario di stringa di data o ora e lo convertirà in un NSDate.

Spero che funzioni, e divertiti!

2

Realizzato a estensione NSString per quello.

// Simple as this. 
date = dateString.dateValue; 

Grazie ad NSDataDetector, riconosce un sacco di formato.

// Tested in GMT+1 (Hungary). 
@"2014-01-16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014.01.16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014/01/16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014 Jan 16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014 Jan 16th" dateValue is <2014-01-16 11:00:00 +0000> 
@"20140116" dateValue is <2014-01-16 11:00:00 +0000> 
@"01-16-2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01.16.2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01/16/2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"16 January 2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01-16-2014 17:05:05" dateValue is <2014-01-16 16:05:05 +0000> 
@"01-16-2014 T 17:05:05 UTC" dateValue is <2014-01-16 17:05:05 +0000> 
@"17:05, 1 January 2014 (UTC)" dateValue is <2014-01-01 16:05:00 +0000> 

parte di eppz!kit, afferrare la categoria NSString+EPPZKit.h da GitHub.


RISPOSTA ORIGINALE: Se non siete sicuri (o semplicemente non si preoccupano) circa il formato della data contenuta nella stringa, uso NSDataDetector per la data parsing.

//Role players. 
NSString *dateString = @"Wed, 03 Jul 2013 02:16:02 -0700"; 
__block NSDate *detectedDate; 

//Detect. 
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil]; 
[detector enumerateMatchesInString:dateString 
          options:kNilOptions 
          range:NSMakeRange(0, [dateString length]) 
         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
{ detectedDate = result.date; }];