NSString para NSDate

Eu tenho uma string que contém a data atual usando isso:

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

Em um ponto diferente, quero recuperar a data dessa string e usei o seguinte código:

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

Estou recebendo dateFromString como nil 0x0. O que estou fazendo de errado?

Você não pode inventar a syntax da string de formato e esperar que ela funcione; você precisa realmente usar um formato documentado. (Sério, “MM” significa “mês”, “minuto” e “minutos de deslocamento GMT” todos ao mesmo tempo?)

Como a documentação aponta, os formatadores 10.4 usam strings de formato Unicode .

Tente “aaaa-MM-dd HH: mm: ss ZZZ” em vez disso.

Além disso, a fonte Objective-C é ASCII. Não coloque caracteres como ± e espere que funcione em qualquer contexto; em vez disso, use arquivos de strings.

Além disso, dateFromString: retorna um NSDate autoreleased, portanto:

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

Você pode querer:

 //NSDate *dateFromString = [[NSDate alloc] init]; NSDate *dateFromString = [dateFormatter dateFromString:]; .... //[dateFromString release]; // dateFromString is autoreleased 

Espero que isso possa salvar alguém 🙂

Você pode conferir o TouchTime.

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

É uma porta direta da incrível function strtotime no PHP em 5.4 para Cocoa e iOS. Ele irá receber praticamente qualquer formato arbitrário de data ou hora e convertê-lo em um NSDate.

Espero que funcione e aproveite!

Fiz uma extensão NSString para isso.

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

Graças ao NSDataDetector , ele reconhece muito 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 do kit eppz ! , pegue a categoria NSString + EPPZKit.h do GitHub.


RESPOSTA ORIGINAL: Se você não tem certeza (ou simplesmente não se importa) sobre o formato de data contido na string, use NSDataDetector para a data de análise .

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

Como respondido anteriormente, é isso que acontece quando você inventa uma nova syntax.

Baseado na documentação de referência de class Apple NSDateFormatter

Existem muitos atributos que você pode obter e definir em um formatador de data de estilo … No entanto, é recomendável não alterar as configurações individuais . Em vez disso, você deve aceitar as configurações padrão estabelecidas na boot e especificar o formato usando setDateStyle :, setTimeStyle:

Isso é especialmente importante para a saída, que é diferente para cada localidade. Por padrão, o NSDateFormatter observa as configurações de localidade do usuário atual. Assim, o mesmo NSDate poderia ser 22.11.2011 18:33:19 , ou Nov 22, 2011 6:33:19 PM , ou 2011-11-22 下午6:33:19 ou até mesmo २२-११-२०११ ६:३३:१९ अपराह् 2011-11-22 下午6:33:19 २२-११-२०११ ६:३३:१९ अपराह् , todos para a mesma input e com o mesmo código.

Considere por exemplo este código

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterShortStyle]; [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; // ShortStyle used: 11/23/37 3:30pm NSString *dateString = [dateFormatter stringFromDate:date]; 

Verifique os documentos da Apple sobre os diferentes estilos de NSDateFormatterStyle ou este excelente tutorial