Czy istnieje jakiś techniczny powód, dla którego w programowaniu domyślnym formatem daty jest RRRRMMDD, a nie coś innego?

118

Czy jest jakiś techniczny powód, dlaczego tak jest? Zastanawiałem się w przypadku RDBMS, że ma to coś wspólnego z wydajnością, ponieważ na przykład „ROK” jest bardziej szczegółowy niż „MIESIĄC”: masz tylko rok 2000, ale każdego roku masz „Styczeń”, co ułatwiłoby / przyspieszyło filtrowanie / sortowanie czegoś według roku, i właśnie dlatego rok jest pierwszy.

Ale nie wiem, czy to naprawdę ma sens ... Czy jest jakiś powód?

lucaswxp
źródło
14
@IMil Może nam się to nie podobać, ale dość często są one przechowywane jako ciągi znaków.
Honza Brabec,
14
@candied_orange To byłoby dziwne, szczególnie w przypadku dat.
glglgl
43
xkcd.com/1179
Helio
19
Na marginesie, ten format nie jest taki obcy. Na przykład w języku węgierskim (i prawdopodobnie także w niektórych innych) RRRR. MM. DD jest domyślnym formatem zapisywanych dat i długo trwało przed komputerami.
Neinstein,
31
W programowaniu domyślny format daty to „RRRRMMDD”? Byłoby miło, gdyby tak było, ale zdecydowanie nie wszędzie tak jest. RFC 822 i RFC 850, a także ANSI C asctime, są nadal szeroko stosowane w wielu miejscach. Fajnie, że RFC 3339 i ISO 8601 stopniowo wypierają starsze formaty iz pewnością powinny być używane w przyszłości. Mówiąc bardziej ogólnie, powiedziałbym, że podstawowa forma ISO 8601 (zwykły RRRRMMDD bez znaków separatora) jest w rzeczywistości mniej powszechna niż niektóre inne formy, takie jak RRRR-MM-DD.
Daniel Pryden,

Odpowiedzi:

386

W ten sposób daty można łatwo sortować jako ciągi znaków przy użyciu domyślnych reguł sortowania (tj. Sortowania leksykograficznego ).

Z tego powodu zarówno miesiąc, jak i dzień są określane za pomocą dwóch cyfr (w razie potrzeby dodając początkowe zero).

W rzeczywistości jest to jeden z formatów daty określonych w ISO 8601 . Ten standard definiuje również format daty i godziny 2015-03-27T15:26:40Z, który można również sortować jako ciągi znaków.

Jednak RRRRMMDD ma tę dodatkową zaletę, że umożliwia łatwe (bez podciągów i zastępowania znaków) parsowanie łańcucha jako liczby całkowitej i nadal korzysta z domyślnego porządku na liczbach całkowitych.

Arseni Mourzenko
źródło
90
@lucaswxp: Jeśli napiszesz porównanie specjalnych przypadków dla ciągów znaków według określonego schematu, możesz oczywiście uczynić go tak barokowym, jak chcesz. Chodzi o to, że schemat jest zaprojektowany tak, że porządek leksykalny (a także porządek leksykalny uwzględniający liczby) jest również porządkiem logicznym, więc nie ma potrzeby dostosowywania.
Deduplicator,
19
@lucaswxp Twój ciąg daty może nie znajdować się w pamięci. Praktyczny przykład: masz już plik csv posortowany według daty ISO i milionów + wierszy rocznie. I chcesz zwrócić tylko wiersze między określonymi datami. Możesz czytać plik linia po linii (rząd po rzędzie), aż dojdziesz do pierwszej daty, a następnie ładuj wiersze do pamięci, aż dojdziesz do ostatniej daty. Możesz pominąć resztę pliku. Ale jeśli zapiszesz datę w innym formacie lub posortujesz według roku, przed zamknięciem pliku musisz przeczytać rekordy z całego roku.
Tom A. Vibeto,
48
Pamiętaj, że myślniki są opcjonalne w ISO 8601, więc RRRRMMDD to ISO 8601.
Martin Ba
32
@Benoit Złożono już propozycję rozwiązania problemu Y10K. Jeśli nadal będziemy korzystać z tej samej ery, przejdziemy do AYYYYYMMDD do Y100K, które będą BYYYYYYMMDD, CYYYYYYYMMDD, DYYYYYYYYYMMDD, EYYYYYYYYYMMDD. Ten wiodący prefiks alfa zapewnia prawidłową kolejność sortowania (pod warunkiem, że „A0RRRR ...” itd. Są niepoprawnymi reprezentacjami, jeśli nadal stosowane są daty RRRR ...). W pewnym momencie, gdy cyfry roku są podzielne przez trzy, zaczniemy dodawać trzy cyfry za każdym razem, gdy zmieniamy prefiks alfa, aby mieć pewność, że nie zabraknie liter przed śmiercią wszechświata.
Monty Harder
35
Należy zauważyć, że w tym formacie sortowanie nie jest po prostu „łatwiejsze”. Sortowanie leksykalne (oparte na znakach) staje się równoważne sortowaniu czasowemu, co oznacza, że ​​możesz sortować tymczasowo bez parsowania .
jpmc26,
135

Jeszcze nie wspomniano, ale szybko zamykasz zamówienie wewnątrz RRRR. To już tysiąclecia, stulecia, dekady, lata. Innymi słowy, RRRR jest już zamawiany od najdłuższego okresu do najkrótszego okresu. To samo dotyczy MM i DD, tak właśnie działa system liczbowy.

Aby więc zachować porządek między polami zgodny z porządkiem w obrębie pól, jedyną opcją jest RRRRMMDD.

Jak zauważyli Zahbaz i Arseni Mourzenko, formaty RRRRMMDD można łatwo sortować. To nie jest szczęśliwy zbieg okoliczności, to bezpośrednia konsekwencja stawiania pól na jak najdłuższy czas na pierwszym miejscu (i utrzymywania stałej długości; wprowadzamy tutaj problem Y10K).

MSalters
źródło
34
Chociaż możesz żartować, ten kod może nas nawiedzić za 8000 lat. Kod żyje dłużej, niż ktokolwiek się spodziewa ... 😓
deceze
15
@deceze ISO8601 ma już przepisy na 5-cyfrowy rok, ale byłoby interesujące zobaczyć, które obecnie implementacje DateTime na to pozwalają.
Zac Faragher,
4
@ZacFaragher, jestem pewien, że będziemy mieli dużo czasu na wdrożenie tego później, nie trzeba się spieszyć, prawda ...?
ilkkachu
51
@deceze Dlaczego mnie odmroziłeś - wymyśliłeś, jak leczyć raka? Nie, to jest rok 9999 i znasz COBOL.
user3067860,
6
Możesz naprawić literówkę. Słowo tysiąclecia , liczba mnoga tysiąclecia , jest obowiązkowo pisane podwójnym N, aby pasować do podwójnego N w skali rocznej od łaciny annus za rok. Kiedy błędnie przeliterujesz go za pomocą pojedynczego N, teraz niefortunnie pasuje do pojedynczego N analnego z odbytu latynoskiego o takim samym znaczeniu, jak jego słowo zapożyczone do angielskiego sportu. Krótko mówiąc, zawsze musisz przeliterować to w sposób, który oznacza, że ​​mówisz o tysiącach lat, a nie tysiącach dziur. :)
tchrist
57

Czy jest jakiś powód?

Tak. Te programy będą korzystać z ISO 8601 .

ISO 8601 ma wiele zalet w porównaniu z innymi formatami dat:

  • To standard z dokumentem specyfikacji :)
  • To jest jednoznaczne. mm / dd / rrrr i dd / mm / rrrr mogą być mylące, chyba że minie 13 dzień.
  • Leksykograficznie sortuje według rosnącego porządku czasowego, więc nie jest wymagana żadna specjalna logika sortowania dat. Jest to szczególnie przydatne w nazwach plików, w których sortowanie liczb leksykograficznych jest często mylące (np 1_file, 10_file, 2_file.).
  • Wymaga 4-cyfrowego roku i zerowanego miesiąca i roku. Pozwala to uniknąć problemu z 2000 roku i innych niejasności.

Jeśli chodzi o to, dlaczego ISO 8601 istnieje w pierwszej kolejności, to dlatego, że ludzie wymieniali formaty dat dwuznaczne i mylące podczas wymiany danych między krajami / systemami i potrzebowali czegoś jednoznacznego.

Uzasadnienie znajduje się we wstępie specyfikacji .

Chociaż zalecenia i standardy ISO w tej dziedzinie są dostępne od 1971 r., Różne formy numerycznej reprezentacji dat i godzin są powszechnie stosowane w różnych krajach. W przypadku, gdy takie reprezentacje są wymieniane między granicami państwowymi, może wystąpić błędna interpretacja znaczenia liczb, powodująca zamieszanie i inne wynikające z tego błędy lub straty. Celem niniejszej normy międzynarodowej jest wyeliminowanie ryzyka błędnej interpretacji oraz uniknięcie pomyłki i jej konsekwencji.

...

W niniejszej Normie Międzynarodowej zachowano najczęściej używane wyrażenia dotyczące daty i godziny oraz ich reprezentacje z wcześniejszych Standardów Międzynarodowych i zapewnia unikalne reprezentacje niektórych nowych wyrażeń używanych w praktyce. Jego zastosowanie w wymianie informacji, zwłaszcza między systemami przetwarzania danych i powiązanym sprzętem, wyeliminuje błędy wynikające z błędnej interpretacji i generowane przez nie koszty. Promowanie tego międzynarodowego standardu nie tylko ułatwi wymianę między granicami międzynarodowymi, ale także poprawi przenośność oprogramowania i ułatwi problemy z komunikacją w organizacji, a także między organizacjami.

Standard definiuje „podstawowe” warianty jako minimalizujące użycie ograniczników. Tak, YYYYMMDDjest podstawowym alternatywny do rozszerzonej formie YYYY-MM-DD.

Strąk
źródło
4
Nie wiedziałem, że ISO 8601 dopuszcza również RRRRMMDD oprócz RRRR-MM-DD.
keuleJ
iso.org/iso-8601-date-and-time-format.html wydaje się wskazywać, że „format rozszerzony” RRRR-MM-DD jest jedynym formatem dla 8601?
Oskar Austegard
3
@keuleJ Minimalizowanie użycia ograniczników, takich jak RRRRMMDD zamiast RRRR-MM-DD, nazywa się „podstawową” odmianą formatu w standardzie ISO 8601.
Basil Bourque,
Dwie dodatkowe zalety ISO 8601: (a) Łatwy do parsowania przez maszynę bez znaku SPACJI i bez zlokalizowanego tekstu oraz (b) Łatwy do intuicji przez ludzi w różnych kulturach, przy czym pierwszy rok będzie łatwy do rozpoznania (jeśli jest współczesny), i bez zakładania języka angielskiego.
Basil Bourque,
55

Jest tak, ponieważ wszystkie inne sposoby na zrobienie tego są niejednoznaczne.

01/02/2003 co to znaczy? Drugi styczeń 2003? Czy w Europie: 1 lutego 2003 r.? Jeszcze gorzej jest, jeśli użyjesz dwóch cyfr dla roku, jak 01/02/03.

Dlatego używasz RRRRMMDD, jest to konwencja, która pozwala nam jasno komunikować się o datach, 20030201, ponieważ data jest zawsze jasna. (i ułatwia sortowanie)

(Teraz nie przechowuj tego jako liczby całkowitej 20 milionów 30 tysięcy dwieście i 1. proszę, dobrze? Proszę, proszę?)

Pieter B.
źródło
14
„Data 20030201 jest zawsze jasna” : Absolutnie tak nie jest. Jest tak dwuznaczny jak „01/02/2003”, chyba że wiesz, że używany jest format RRRRMMDD (czy to RRRRDMM lub DDMMRRRR? ...). ZAWSZE musisz znać format daty; nie ma „konwencji”, która czyni sprawy jednoznacznymi.
skomisa
6
@skomisa, co jest dość niepoprawne. ISO 8601 zdefiniował międzynarodowy standardowy format daty specjalnie z podanych powodów. Żaden z pozostałych formatów nie jest prawidłowym formatem daty i nie był od 19880605
K. Alan Bates
11
@ K.AlanBates Twoja data jest dwuznaczna, chyba że założymy, że należy ją przeanalizować zgodnie z ISO 8601.
Goyo
16
20030201 jest 20 marca 201 AD, prawda?
David Richerby
10
@Martijn, ale specyficzne dla języka. W Turcji jest to ububat, a nie luty (zanim pomyślisz, że Twój kod działa, zawsze sprawdź Turcję ).
NH.
19

Niech t1 i t2 będą odrębnymi liczbami całkowitymi, które reprezentują dwa razy zapisane w formacie RRRRMMDD. Zatem t1 <t2 oznacza, że ​​t2 wystąpiło po t1.

Tracisz to zamówienie przy pierwszym formatowaniu DD i MM.

ISO jest, według IMO, jedynym rozsądnym formatem.

zahbaz
źródło
1
Tyle że nigdy nie przechowałbyś tego jako liczby całkowitej, przynajmniej nigdy go nie widziałem ani nie rozważałem.
rura
5
@pipe: Uwierz mi, niektórzy by to zrobili. Utrzymujemy starszy system, który przechowuje RRRRMMDD jako liczby całkowite. Projekt prawdopodobnie pochodzi z jakiegoś starego systemu bazy danych bez wyraźnego typu daty i został zachowany dla zachowania kompatybilności wstecznej. To nie jest ładne. Nie rób tego
Heinzi,
19
@pipe Z mojego doświadczenia w branży oprogramowania wynika, że ​​ilekroć rozsądna osoba chciałaby powiedzieć „Ale nigdy nie zrobiłbyś X”, zawsze istnieje co najmniej jeden kontrprzykład
Joseph Rogers
5
@pipe W hurtowni danych często zdarza się, że używa się liczb całkowitych rrrrmmdd jako klucza podstawowego / zastępczego dla tabeli dat.
mydlista
4
@pipe, cóż, numerem sekwencyjnym strefy DNS jest 32-bitowa liczba całkowita, którą należy zwiększyć, gdy strefa się zmieni. Chociaż może to być zwykła liczba, powszechnym idiomem jest używanie liczb takich jak 2018092601 ... Następnie istnieje kilka ciekawych definicji magicznych liczb w opisie feature_test_macros(7), na przykład posiadających _POSIX_C_SOURCE > 200809Lśrodki, które obsługują funkcje z POSIX.1-2008 ...
ilkkachu
12

Jedną z kwestii, o których nie wspomniano, jest to, że w wejściach interaktywnych ten format pozwala kontrolować dane wejściowe.

System nie może wiedzieć, czy miesiąc ma 28, 29, 30 lub 31 dni, nie znając konkretnego roku i miesiąca. Kiedy interaktywne dane wejściowe nakazują, aby rok i miesiąc były na pierwszym miejscu, można sprawdzić, czy dzień (wstawiony jako ostatni) jest w dozwolonym zakresie.

To prawda, że ​​pytanie dotyczyło głównie formatu daty, ale można argumentować, że format daty jest zgodny z formatowaniem przedstawionym użytkownikowi.

Jaskółka oknówka
źródło
7

Zamówienia RRRRMMDD pochodzą z tego samego sposobu, w jaki składane są numery: najpierw najważniejsza część. MMDDRRRR byłoby jak napisanie „sto dwadzieścia trzy” jako „dwadzieścia sto trzy”.

W naszej kulturze naturalnie rozumiemy MMDDRRRR, ponieważ jako ludzie mamy świadomość czasu, a lata powoli postępują. Ogólnie wiemy, jaki jest rok. Widok roku rzadko ma znaczenie, więc przesuwamy go do tyłu. Miesiące zmieniają się po prostu wystarczająco szybko, aby zachować swoje znaczenie. Inne kultury radzą sobie z tym inaczej. Znaczna część świata woli DDMMRRRR.

Joel Coehoorn
źródło
62
Możesz przeformułować „naszą kulturę”, ponieważ w mojej kulturze jest to DDMMRRRR, więc nie jest to „nasza” kultura, tylko Twoja
slebetman
66
Kompleksowa mapa wszystkich krajów korzystających z formatu daty MMDDRRRR img-9gag-fun.9cache.com/photo/a2mXmGd_700b.jpg
Peregrine
9
Wydaje się to dziwnym argumentem: „Miesiące zmieniają się wystarczająco szybko, aby zachować swoje znaczenie” -> Dlaczego więc nie postawić dnia na pierwszym miejscu, ponieważ zmienia się to jeszcze szybciej?
Wim Deblauwe,
7
@JoelCoehoorn, łatwo to wyrazić („W naszej amerykańskiej kulturze”). „nasze” / „my” jest często używane w znaczeniu „społeczność wymiany stosów”.
AnoE
14
Dokładnie. Stackoverflow jest międzynarodowy . To, że mieszkasz w USA, nie oznacza, nie sugeruje ani nawet nie zwiększa prawdopodobieństwa, że ​​inni też. Nie możesz tutaj zakładać, czy twoi czytelnicy znajdują się na całym świecie. Większość czytelników nie będzie ani tobą, ani operatorem, ale innymi osobami, które znajdą odpowiedź w Google. Ten komentarz został napisany na innym kontynencie niż ten, na którym żyjesz. I chociaż mamy własne - ehm - ciekawe nawyki, z pewnością nie używamy MM / DD / RRRR tutaj ...
cmaster
6

Wspomniano o sortowaniu, ale zdecydowanie najbardziej użytecznym powodem jest porównanie ich jako „ciągów”, i tak, 26-znakowy znacznik czasu jest uporządkowany podobnie.

Wiem, że takie porównania są niezbędne do sortowania, ale generalnie są przydatne do sortowania 2-elementowego.

Pracowałem nad projektami, w których nie zostało to przyjęte, i tak, programiści próbowali (z mieszanymi wynikami) porównać daty jako ciągi znaków.

Ładne formatowanie jest po stronie klienta lub składu.

mckenzm
źródło
5

Ten format sprawia, że ​​kolejność alfabetyczna ciągów jest identyczna z chronologiczną kolejnością dat. Jest to przydatne, ponieważ wiele narzędzi zapewnia alfabetyczne porządkowanie np. Plików według nazwy, ale nie ma możliwości analizowania dowolnie sformatowanych dat na podstawie nazw plików i sortowania według nich.

WolfgangGroiss
źródło
4

Chodzi o restrykcyjność. Wyobraź sobie ROK, MIESIĄC i DZIEŃ jako parametry, w formacie RRRRMMDD każdy parametr jest bardziej restrykcyjny niż poprzedni.

Więc jeśli chcesz wyszukać coś, co wydarzyło się w 1970 roku, możesz to zrobić, wyszukując ciąg znaków od "1970*", ale jeśli pamiętasz, który miesiąc był, możesz dodać miesiąc jak "197005*". W ten sposób każdy „parametr” daty daje bardziej szczegółowe informacje.

To jedyny sposób na przejście od mniej szczegółowych informacji ( "1970*") do bardziej szczegółowych informacji ( "19700523").

mrvinent
źródło
3
Niezbyt świetny argument - równie często poszukiwanie rzeczy dzieje się w określonych miesiącach, a nie w określonych latach.
Cubic
1
Jeśli 1970*i 197005*reprezentują składnię symboli wieloznacznych „glob”, możesz wyszukać kilka dat MMDDYYYY, wyszukując glob *1970lub 05*1970. Twoja odpowiedź może domyślnie zakładać dodatkowe ograniczenie, o którym wyraźnie nie wspomniałeś, i można je poprawić, wyjaśniając twoje założenie.
Quuxplusone
3
Jest to coś w rodzaju efektu ubocznego lub innego sposobu opisania kolejności kluczy sortowania, o której wspominają inne odpowiedzi. Ale to wyjaśnienie się rozpada, chyba że ograniczysz je do wyszukiwania na prefiksach. (Łatwiejszy do indeksowania, ale w żadnym wypadku nie jest wymagany).
Peter Cordes,
Oznacza to również, że możesz wybrać sekwencję dat za pomocą stosunkowo prostych wyrażeń regularnych ...
Harper
1

Dlaczego podczas programowania domyślnym formatem daty jest RRRRMMDD ...

Jest to czytelny dla człowieka format danych wejściowych i wyjściowych, niekoniecznie jest przechowywany w ten sposób.

Ponad jedna trzecia wszystkich języków programowania została opracowana w kraju, w którym angielski jest językiem podstawowym, a większość współczesnych jest zgodna z jakimś opisem standardu - międzynarodowym standardem dat jest ISO 8601 .

Więcej informacji: (TMI?)

W miarę upływu czasu, zwykle do przodu, przyrosty dni najpierw, a następnie miesiące, a potem lata - może być łatwiej zrozumieć, gdybyśmy mieli daty dziesiętne (i czas dziesiętny ) - w miarę upływu czasu liczba się powiększa. Po prostu ludziom łatwiej jest spojrzeć na liczbę i porównać ją z inną datą na pierwszy rzut oka.

Komputer nie dba o to, jakiej struktury chcesz użyć i na większości (ale nie wszystkich ) komputerach używana jest logika binarna - podstawa e faktycznie ma najniższą ekonomię podstawową, ale nie jest najbardziej wydajna ani najłatwiejsza dla pełnej sekwencji .

Rzeczywisty format danych wejściowych i wyjściowych różni się w zależności od kraju i zależy od lokalizacji , podczas gdy RRRRMMDD może wydawać się najbardziej sensowny i być przyzwyczajonym do tego, że nie jest dziś powszechny , ani nie było tak w przeszłości dla najdłużej, ale nawet dziś cyfry rzymskiepowszechnie używane do dat .

Znajomość roku z góry informuje o liczbie dni w roku, największej różnicy w czasie trwania roku. Informuje z góry o liczbie kolejnych dni w każdym miesiącu (w celu sprawdzenia błędów podczas wprowadzania), umożliwiając wprowadzenie danych z pierwszego dnia, może być konieczne utworzenie kopii zapasowej, jeśli kolejny rok nie zgadza się z danymi wejściowymi - co może utrudnić dostęp do danych wejściowych . Ma to również znaczenie w odniesieniu do formatu kalendarza . Zobacz także kalendarz maniaków z jego dziesiętnymi gwiazdkami.

Jeśli chodzi o komputer, może on używać czasu Epoki UNIX , liczby sekund, które upłynęły od 00:00:00 uniwersalnego czasu koordynowanego (UTC), czwartek, 1 stycznia 1970 r., Gdzie każdy dzień jest traktowany tak, jakby zawierał dokładnie 86400 sekund. Zobacz także dzień juliański . Format RRRRMMDD jest po prostu preferowany przez egocentrycznych ludzi, IAU uważa rok za rok julijski wynoszący 365,25 dni (31,5576 milionów sekund), chyba że podano inaczej.

Obrabować
źródło
1
Właściwie prawie każdy człowiek i oprogramowanie, jakie kiedykolwiek spotkałem, woli inny format.
Goyo
1
Miło mi cię poznać! Jestem Dave i wolę YYYYMMDD
Reversed Engineer,
0

Innym zastosowaniem, jakie widziałem w tej reprezentacji, jest to, że możesz przechowywać daty jako liczby całkowite (tj. W bazie danych), używając tylko 4 bajtów na datę. Użycie RRRRMMDD oznacza zatem, że porównania liczb całkowitych (często pojedyncza instrukcja maszynowa) mają taki sam wynik jak porównania w reprezentowanej dacie. I drukuje umiarkowanie czytelnie dla człowieka. I to nie wymaga żadnego kodu ani specjalnego wsparcia w żadnym głównym środowisku programistycznym.

Jeśli te rzeczy to większość tego, co musisz zrobić z datami, i musisz zrobić dużo, to ten format ma duży urok.

Dla porównania daty w popularnych formatach, takich jak DD / MM / RRRR, przyjmują 10 bajtów jako ciąg znaków ASCII. Ciągi RRRRMMDD zmniejszają to do 8 i zyskują zaletę „porównywanie reprezentacji daje taki sam wynik jak porównywanie dat”, ale nawet wtedy porównanie oparte na łańcuchach jest porównanie znak po znaku, a nie porównanie pojedynczej liczby całkowitej.

Ben
źródło
2
Pakowanie daty w trzy bajty jest banalne. Zakres 0000 ~ 9999 wymaga 14 bitów, 01 ~ 12 wymaga 4 bitów, a 01 ~ 31 wymaga 5 bitów, co daje sumę 23 bitów. Używając również pozostałego bitu w ilości trzech bajtów, możesz reprezentować daty w okresie 32 768 lat, zachowując jednodniową rozdzielczość. Można to wykorzystać na przykład do umożliwienia reprezentowania dat z zakresu od 8191 pne do 24576 ne. Pakując bity jako, powiedzmy, rrrrrrrrrrrrrrmmmddddd, reprezentacja dziesiętna pozostaje bezpośrednio porównywalna (choć nie jest czytelna dla człowieka, ale kogo to obchodzi z fizycznym przechowywaniem bazy danych?).
CVn
0

Ten sam powód, dla którego Księżyc jest zrobiony z zielonego sera: nie jest. W większości przypadków domyślnym formatem jest jakiś zlokalizowany ciąg. Czasami używany jest format ISO, ale zwykle z myślnikami dla lepszej czytelności. YYYYMMDD(lub %Y%m%dw strftimejęzyku potocznym) rzadko jest ustawieniem domyślnym. Szczerze mówiąc, jestem pewien, że to widziałem, ale nie mogę teraz wymyślić żadnego przykładu.

Data uniksowa (podstawowe narzędzia GNU)

date

Wynik:

Wed Sep 26 22:20:57 CEST 2018

Pyton

import time
print(time.ctime())

wynik:

Wed Sep 26 22:27:20 2018

do

#include <stdio.h>
#include <time.h>

int main () {
   time_t curtime;

   time(&curtime);
   printf(ctime(&curtime));
   return(0);
}

Wynik:

Wed Sep 26 22:40:01 2018

C ++

#include <ctime>
#include <iostream>

int main()
{
    std::time_t result = std::time(nullptr);
    std::cout << std::ctime(&result);
}

Wynik:

Wed Sep 26 22:51:22 2018

JavaScript

current_date = new Date ( );
current_date;

Wynik:

Wed Sep 26 2018 23:15:22 GMT+0200 (CEST)

SQLite

SELECT date('now');

Wynik:

2018-09-26

LibreOffice Calc

wprowadź opis zdjęcia tutaj

Gnumeric

wprowadź opis zdjęcia tutaj

OnlyOffice

wprowadź opis zdjęcia tutaj

Python + numpy

import numpy as np
pd.datetime64('now')

Wynik:

numpy.datetime64('2018-09-26T21:31:55')

Python + pandy

import pandas as pd
pd.Timestamp('now', unit='s')

Wynik:

Timestamp('2018-09-26 21:47:01.277114153')

Inżynieria oprogramowania

wprowadź opis zdjęcia tutaj

apport.log

ERROR: apport (pid 9742) Fri Sep 28 17:39:44 2018: called for pid 1534, signal 6, core limit 0, dump mode 2

alternatives.log

update-alternatives 2018-05-08 15:14:24: run with --quiet --install /usr/bin/awk awk /usr/bin/mawk 5 --slave /usr/share/man/man1/awk.1.gz awk.1.gz /usr/share/man/man1/mawk.1.gz --slave /usr/bin/nawk nawk /usr/bin/mawk --slave /usr/share/man/man1/nawk.1.gz nawk.1.gz /usr/share/man/man1/mawk.1.gz

puchary / access.log

localhost - - [28/Sep/2018:16:41:58 +0200] "POST / HTTP/1.1" 200 360 Create-Printer-Subscriptions successful-ok

syslog

Sep 28 16:41:46 pop-os rsyslogd:  [origin software="rsyslogd" swVersion="8.32.0" x-pid="946" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Goyo
źródło
10
aby dodać do argumentu, ile z nich jest sformatowanych w ten sposób z powodu ustawień użytkownika na komputerze, na którym uruchomiłeś skrypt?
Topher Brink
Pierwszy nie jest tak naprawdę „bash”, to program daty (i wyświetla Do 27. Sep 22:27:09 CEST 2018tutaj.)
Paŭlo Ebermann
@ PaŭloEbermann Masz rację, mam nadzieję, że teraz jest lepiej. Jak powiedziałem, wiele z tych formatów jest zlokalizowanych, więc rzeczywisty format, jaki zobaczysz, będzie zależeć od opcji lokalizacji.
Goyo
3
Chociaż punkt tej odpowiedzi jest prawdziwy w przypadku aplikacji zorientowanych na użytkownika końcowego, nie dotyczy to wymiany danych między systemami, serializacji danych, protokołów wiadomości / danych, rejestrowania, śledzenia, debuggerów i tak dalej. Norma ISO 8601 szybko staje się normą dla takich zastosowań skierowanych do administratorów systemów i programistów. To samo dotyczy scenariuszy międzynarodowych lub niezależnych od regionu.
Basil Bourque,
@BasilBourque Dzięki, dodałem losową próbkę dzienników znalezionych w moim systemie. Nie mam pod ręką przykładów innych typów. Ale nie sądzę, że tendencja do domyślnej zgodności z ISO 8601 w określonych domenach czyni jej podstawowy wariant „domyślnym w programowaniu” w obliczu ogromnej ilości oprogramowania, które domyślnie stosuje inne formaty.
Goyo
-1

Dodatkową korzyścią nie wspomnianą do tej pory jest to, że pożądana kwantyzacja (przypisanie dokładnej wartości jako należącej do tego samego ogólnego zakresu wartości) jest stosunkowo łatwą i szybką pojedynczą operacją.

Załóżmy, że piszesz raport podsumowujący dzisiejsze wydarzenia, takie jak suma i liczba sprzedaży. Data i godzina sprzedaży są przechowywane jako RRRRMMDDGGMISS, wystarczy zachować 8 znaków z lewej strony (jeśli jest to ciąg znaków) lub podzielić liczbę całkowitą (tj. Piętro) o 1 000 000, aby skrócić datę i datę do dnia sprzedaży.

Podobnie, jeśli chcesz sprzedać miesiąc, zachowujesz tylko 6 cyfr z lewej strony lub dzielisz przez 100 000 000

Jasne, można argumentować, że możliwa jest dowolna manipulacja ciągiem, datetime dla sprzedaży „12-25-2018 12:34 pm” można podciągać i manipulować wiele razy, aby uzyskać miesiąc i rok. W postaci liczbowej 122520181234 można by podzielić i modulować, i zwielokrotnić, i podzielić jeszcze więcej, i ostatecznie wygenerować miesiąc i rok .. .. ale kod byłby naprawdę trudny do napisania, odczytania, utrzymania i zrozumienia ..

Nawet wyrafinowani optymalizatorzy baz danych mogą nie być w stanie użyć indeksu w kolumnie dla klauzuli where, jeśli forma daty to MM / DD / RRRR, ale zostaną podzielone i poskładane. Dla porównania, przechowywanie reprezentacji RRRRMMDD i oczekiwanie grudnia 2018 r. Prowadzi do tego, gdzie klauzule ilk dateasstring LIKE '201812%'lub dateasint BETWEEN 20181200 and 20181299- coś, co można łatwo zastosować do indeksu

Zatem jeśli nie istniałby dedykowany typ danych dla dat i reprezentacja łańcuchowa / numeryczna była jedynym wyborem, użycie i przechowywanie czasów w niektórych reprezentacjach najdłuższego przedziału od lewej do najkrótszego przedziału od na Right ma wiele zalet ułatwiających zrozumienie, manipulowanie, przechowywanie, pobieranie i konserwację kodu

Caius Jard
źródło