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