Qual string de formato devo usar por milissegundos em strings de data no iPhone?

100

Sou obrigado a analisar strings em um formato que inclui milissegundos. Qual string de formato devo usar para obter o valor de data correto?

Por exemplo, suponha que eu tenha uma string com o seguinte valor: "2011-06-23T13: 13: 00.000"

Qual string de formato devo passar para meu NSDateFormatter no código a seguir?

NSString *dateValue = @"2011-06-23T13:13:00.000";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSString *formatString = @"yyyy-MM-dd'T'HH:mm:ss.???";
[formatter setDateFormat:formatString];
NSDate *date = [formatter dateFromString:dateValue];

O que devo usar no lugar de ??? no código acima?

preso por idade
fonte

Respostas:

211

É SSS, de acordo com a especificação Unicode Locale Data Markup Language .

"yyyy-MM-dd'T'HH:mm:ss.SSS"

De forma mais geral, use qualquer número de caracteres S maiúsculos para obter essa quantidade de casas decimais no componente de frações de segundo. (Isso ss.Smostrará o tempo até o décimo de segundo mais próximo, por exemplo.)

Simon Whitaker
fonte
2
Gostaria de saber se você sabe como posso fazer uma análise tolerante dos milissegundos. A data pode ter 6, 7 ou até mesmo nenhum milissegundo. Eu poderia usar expressões regulares, mas gostaria de saber se isso pode ser feito fora da caixa com uma string de formato adequado.
Cyupa,
Desta forma, o número máximo de S é três, por exemplo, SSS. Se você adicionar mais, você obterá apenas zeros, por exemplo, para timeIntervalSince1970 de 1415986217.544384 e .SSSSSS você obterá 0,544000, portanto, não é uma ótima solução.
malhal
@Cyupa Um milissegundo é apenas 1/1000 de um segundo. 6 casas decimais correspondem a microssegundos e 1 casa decimal corresponde a dez segundos. - Usar milissegundos para qualquer número de decimais é tão errado quanto usar literalmente para algo figurativamente; você ainda pode fazer isso, mas isso está mudando o significado da palavra.
Liggliluff
4

Você precisa passar o mesmo número de 'S' no final, por exemplo, Minha data era '2015-11-17T03: 36: 45.041503Z' e usei 'aaaa-MM-dd'T'HH: mm: ss.SSSSSSz' formatador, quero dizer ver o número de 'S' é 6 como 6 dígitos entrando na data.

Prakash Raj
fonte
O que seria formatado para obter nanossegundos em microssegundos em vez de milissegundos. Tentei com 'aaaa-MM-dd'T'HH: mm: ss.SSSSSSz' e 'aaaa-MM-dd'T'HH: mm: ss.SSSSSSSSSz' e não funcionou.
IndexOutOfDevelopersException
-1

use SSSpara três casas decimais de um segundo

"yyyy-MM-dd'T'HH:mm:ss.SSS"
Harryovers
fonte
Isso falha. Não tenho data de volta.
ageek preso em