Pergunta

Se eu usar o código a seguir:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];   
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm"];
NSDate *myDate = [dateFormatter dateFromString:@"2010-01-28T15:22:23.863"];
NSLog(@"%@", [dateFormatter stringFromDate:myDate]);

Ele é convertido com êxito a um objeto Date, no entanto, eu não consigo formatá-lo de outra maneira do que yyyy-MM-dd'T'HH:mm, ou seja, o que é registrado é 2010-01-28T15:22:23

Se eu mudar o dateFormat dizer [dateFormatter setDateFormat:@"yyyy-MMMM-d'T'HH:mm"]; do objeto Date é nulo ...

Então, minha pergunta final é como formatar um ISO8601 timestamp a partir de um banco de dados SQL para uso, por exemplo, NSDateFormatterMediumStyle voltar "1 de janeiro de 2010"?

Foi útil?

Solução

Você precisa de outro formatador para lidar com a saída. Coloque isso depois de seu código:

NSDateFormatter *anotherDateFormatter = [[NSDateFormatter alloc] init];   
[anotherDateFormatter setDateStyle:NSDateFormatterLongStyle];
[anotherDateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@", [anotherDateFormatter stringFromDate:myDate]);

Outras dicas

Eu tenho um similiar mas o problema um pouco mais complexo, e eu encontrei uma solução muito simples!

O problema: Meus recebidas ISO8601 datas parecido com este: 2006-06-14T11:06:00+02:00 Eles têm um deslocamento no final fuso horário

.

A solução: Usar Peter Hosey ISO8601DateFormatter que você pode baixar a partir aqui .

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSDate *theDate = [formatter dateFromString:dateString];
[formatter release], formatter = nil;

e

ISO8601DateFormatter *formatter = [[ISO8601DateFormatter alloc] init];
NSString *dateString = [formatter stringFromDate:[twitch dateTwitched]];
[formatter release], formatter = nil;

Aqui está o código de exemplo da Apple

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate *date = [formatter dateFromString:dateString];

link: https://developer.apple.com/library /ios/#qa/qa1480/_index.html

Apenas para mencionar que desde iOS 6.0 você pode usar este formato:

 yyyy-MM-dd'T'HH:mm:ssZZZZZ

Eu tenho uma implementação muito rápida C de analisar ISO8601 NSStrings para NSDates em SAMCategories . Você pode instalá-lo com CocoaPods ou apenas copiar os arquivos para seu projeto.

Veja como usá-lo:

[NSDate sam_dateFromISO8601String:@"2013-08-24T06:51:21-07:00"]

É muito robusta e suportes faltando fusos horários, etc. Como meu comentário acima disse, NSDateFormatter foi muito lento para mim durante a análise de lotes de datas. Mudar para esta implementação ajudou uma imensa quantidade.

Este código é utilizado em 6 aplicativos de produção (incluindo Hipstamatic e Roon ) que eu já trabalhei com nenhum conhecido problemas. Há um conjunto de testes para evitar regressão.

Em suma, penso que esta é a melhor maneira de analisar ISO8601 cordas em Objective-C.


Um curto lado, se você estiver preocupado com o desempenho e transferência, o envio de números inteiros em vez de ISO8601 cordas é muito preferido. Você pode simplesmente convertê-los em datas com [NSDate dateWithTimeIntervalSince1970:yourInteger]. O desempenho é tão rápido quanto você pode fazê-lo e há menos caracteres para transferir ao longo do fio.

Devo observar que a última vez que verifiquei Maçãs NSDate métodos não apoiar ISO8601. Eu ainda tenho um bug com a Apple sobre a colocação de apoio oficial em.

+ (id)dateWithNaturalLanguageString:(NSString *)string

será adequadamente (última vez que eu corri) parse e criar um objeto NSDate a partir de uma seqüência de ISO801, embora a documentação diz que você não deve usá-lo, ele trabalhou em todos os ISO8601 datas que eu tentei até agora.

resposta @danielbeard funcionou para mim. No entanto, você precisa incluir o fuso horário caso contrário ele converte uma data UTC em seu fuso horário atual, que não é o que você quer.

- (NSDate *) dateFromISO8601DateString:(NSString *) dateString {
    NSDateFormatter * dateFormatter = [NSDateFormatter new];
    dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    NSDate * date = [dateFormatter dateFromString:dateString];
    return date;
}

capitão @Thread Tente este formato: "AAAA-MM-dd'T'HH: mm: ss.SSS"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top