Jaka jest różnica między formatami dat ISO 8601 i RFC 3339?

280

ISO 8601 i RFC 3339 wydają się być dwoma formatami powszechnymi w Internecie. Czy powinienem używać jednego nad drugim? Czy to tylko rozszerzenie? Czy naprawdę muszę się tym przejmować?

Mark Amery
źródło
42
Zmieniłem link do RFC z ietf.org/rfc/rfc3339.txt na wersję HTML na tools.ietf.org/html/rfc3339 . Łącząc się z RFC, zawsze powinieneś linkować do wersji HTML na tools.ietf.org/html . Są nie tylko łatwiejsze w nawigacji dzięki linkom do sekcji, ale, co ważne, na górze znajdują się wszystkie RFC, które zaktualizowały lub przestarzały RFC, który czytasz. Ludzie przez cały czas nieświadomie powołują się na przestarzałe RFC na Stack Overflow, i będę powtarzał tę radę, dopóki problem nie zniknie. (Aby uniknąć wątpliwości, ten RFC nie jest przestarzały.)
Mark Amery

Odpowiedzi:

238

Czy to tylko rozszerzenie?

Raczej tak - RFC 3339 jest wymieniony jako profil ISO 8601. Przede wszystkim RFC 3339 określa pełną reprezentację daty i godziny (opcjonalnie tylko ułamki sekund). RFC ma także niewielkie, subtelne różnice. Na przykład skrócone reprezentacje lat zawierające tylko dwie cyfry nie są dozwolone - RFC 3339 wymaga 4-cyfrowych lat, a RFC pozwala na stosowanie znaku kropki jako punktu dziesiętnego dla ułamków sekund. RFC pozwala również na zastąpienie litery „T” spacją (lub inną postacią), podczas gdy standard pozwala na jej pominięcie (i tylko wtedy, gdy istnieje zgoda między wszystkimi stronami korzystającymi z reprezentacji).

Nie martwiłbym się zbytnio różnicami między nimi, ale na przypadek, w którym trafi do nich Twój przypadek użycia, warto spojrzeć na:

ConroyP
źródło
11
W drugą stronę ISO pozwala pominąć „T”, ale RFC 3339 wymaga tego tools.ietf.org/html/rfc3339#page-12
Java Guy
21
Przepraszamy, Java Guy, ale to nie do końca prawda. Dodatek, do którego się odwołujesz, ma wyłącznie charakter informacyjny, a ograniczenie ma na celu uproszczenie gramatyki. Uwaga na końcu sekcji 5.6 wyraźnie stwierdza, że ​​ze względu na czytelność można użyć spacji, odnosząc się do wcześniejszej wzmianki o czytelności, która jest przedmiotem sekcji 5.2. cytując: „Aplikacje korzystające z tej składni mogą ze względu na czytelność wybrać pełną datę i pełny czas oddzielone (powiedzmy) spacją”.
Greg A. Woods
8
@JavaGuy Dodatek, z którym się łączysz, nawet nie mówi o składni RFC 3339 - zatytułowany jest ISO 8601 Collected ABNF i jest próbą formalnego opisania gramatyki ISO 8601 przy użyciu ABNF . Nic, co mówi, nie powinno być traktowane jako dowód na temat składni datetime RFC 3339.
Mark Amery
3
FWIW: Zostało to omówione na liście coreutils: lists.gnu.org/archive/html/bug-coreutils/2006-05-05/msg00019.html
Frederick Nord
9
Jestem autorem, z którym skontaktował się Justin (poprzedni komentarz) (choć nie jestem odpowiedzialny za większość tam ciężkich ładunków). Potwierdzam jego komentarz. Ogólnie sugerowałbym, że dokumenty specyfikacji, takie jak RFC3339, określają zamiast wymagać - to kontekst użycia określa, co jest wymagane . Dopóki jest jasne, co jest zamierzone, odwoływanie się do konkretnej produkcji składni jest w porządku. (Nie różni się to tak naprawdę od tego, co robi RFC3339, dokonując wybiórczego odniesienia do ISO8601.) Patrz także UWAGA w sekcji 5.6 .
Graham Klyne,
20

RFC 3339 jest głównie profilem ISO 8601, ale w rzeczywistości jest niespójny z zapożyczaniem specyfikacji strefy czasowej „-00: 00” z RFC 2822. Jest to opisane w artykule w Wikipedii.

Zefram
źródło
4

Nie powinieneś się tym przejmować. RFC 3339, sam w sobie, jest zbiorem standardów wywodzących się z ISO 8601. Istnieje jednak kilka minutowych różnic i wszystkie one są przedstawione w RFC 3339. Mógłbym je wszystkie przejrzeć tutaj, ale prawdopodobnie lepiej by było po prostu czytam dokument dla siebie w przypadku, gdy się martwisz:

http://tools.ietf.org/html/rfc3339

David Morton
źródło