É fácil obter a string de data ISO 8601 (por exemplo, 2004-02-12T15:19:21+00:00
) em PHP via date('c')
, mas como obtê-la em Objective-C (iPhone)? Existe uma maneira igualmente curta de fazer isso?
Este é o longo caminho que encontrei para fazer isso:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSDate *now = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:now];
NSLog(@"ISO-8601 date: %@", formattedDateString);
// Output: ISO-8601 date: 2013-04-27T13:27:50-0700
Parece um monte de bobagens para algo tão central.
ios
nsdate
nsdateformatter
iso8601
JohnK
fonte
fonte
Respostas:
Use
NSDateFormatter
:E em Swift:
fonte
setLocale
importante?O iOS 10 apresenta uma nova
NSISO8601DateFormatter
classe para lidar exatamente com isso. Se você estiver usando o Swift 3, seu código seria algo assim:fonte
string
contém "2016-09-03T21: 47: 27Z".Como complemento à resposta de maddy, o formato de fuso horário deve ser "ZZZZZ" (5 vezes Z) para ISO 8601 em vez de um único "Z" (que é para formato RFC 822). Pelo menos no iOS 6.
(consulte http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns )
fonte
Um problema frequentemente esquecido é que as strings no formato ISO 8601 podem ter milissegundos ou não.
Em outras palavras, ambos "2016-12-31T23: 59: 59.9999999" e "2016-12-01T00: 00: 00" são legítimos, mas se você estiver usando um formatador de data de tipo estático, um deles não será analisado .
A partir do iOS 10, você deve usar o
ISO8601DateFormatter
que lida com todas as variações de strings de data ISO 8601. Veja o exemplo abaixo:Para iOS 9 e versões anteriores, use a seguinte abordagem com vários formatadores de dados.
Não encontrei uma resposta que abranja os dois casos e abstraia essa diferença sutil. Aqui está a solução para isso:
Uso:
Também recomendo verificar o artigo da Apple sobre formatadores de data.
fonte
Portanto, use a categoria de Sam Soffee no NSDate encontrada aqui . Com esse código adicionado ao seu projeto, você pode, a partir de então, usar um único método no NSDate:
Não é apenas uma linha, é muito mais rápido do que a abordagem NSDateFormatter, uma vez que é escrito em C. puro.
fonte
Do IS8601 , os problemas são a representação e o fuso horário
year-month-day time timezone
T
Aqui estão algumas strings válidas
Soluções
NSDateFormatter
Então, aqui está o formato que estou usando no onmyway133 ISO8601
Sobre o
Z
identificador Tabela de símbolos de campo de dataSobre a
locale
formatação de dados usando as configurações locaisSobre
en_US_POSIX
perguntas e respostas técnicas QA1480 NSDateFormatter e datas na InternetPerguntas interessantes relacionadas
fonte
Basta usar NSISO8601DateFormatter do framework Foundation.
https://developer.apple.com/documentation/foundation/nsiso8601dateformatter?language=objc
fonte
Com base nesta essência: https://github.com/justinmakaila/NSDate-ISO-8601/blob/master/NSDateISO8601.swift , o método a seguir pode ser usado para converter NSDate em string de data ISO 8601 no formato aaaa-MM -dd'T'HH: mm: ss.SSSZ
fonte
S
para sub-segundo foi fundamental aquiIsso é um pouco mais simples e coloca a data no UTC.
fonte
Usando Swift 3.0 e iOS 9.0
fonte