C'è qualche motivo tecnico per cui, in programmazione, il formato data predefinito è YYYYMMDD e non qualcos'altro?

116

C'è qualche motivo ingegneristico perché è così? Mi chiedevo nel caso di un RDBMS che avesse qualcosa a che fare con le prestazioni, dal momento che un "ANNO" è più specifico di un "MESE", ad esempio: hai solo un anno 2000, ma ogni anno ha "Gennaio", che renderebbe più semplice / veloce il filtro / ordinamento di qualcosa per anno, ed è per questo che viene l'anno per primo.

Ma non so se questo abbia davvero senso ... C'è qualche ragione?

    
posta lucaswxp 25.09.2018 - 00:43
fonte

14 risposte

379

In questo modo, le date possono essere facilmente ordinate come stringhe utilizzando le regole di ordinamento predefinite (ad esempio ordinamento lessicografico ).

Questo è anche il motivo per cui sia il mese che il giorno sono specificati usando due cifre (aggiungendo uno zero iniziale se necessario).

In effetti è uno dei formati di data definiti da ISO 8601 . Questo standard definisce anche un formato data-ora, 2015-03-27T15:26:40Z , che è anche ordinabile come stringhe.

Tuttavia, YYYYMMDD ha un ulteriore vantaggio di rendere possibile facilmente (senza sottostringhe o sostituzioni di caratteri coinvolte) analizzare la stringa come numero intero e continuare a utilizzare l'ordinamento predefinito sui numeri interi.

    
risposta data 25.09.2018 - 00:49
fonte
131

Non menzionato ancora, ma rapidamente sorvegli l'ordine all'interno YYYY. Sono già millenni, secoli, decenni, anni. Vale a dire, YYYY è già ordinato dal periodo più lungo al periodo più breve. Lo stesso vale per MM e DD, è proprio come funziona il sistema numerico.

Quindi per mantenere l'ordine tra i campi coerenti con i campi dell'ordine , l'unica opzione è YYYYMMDD.

Come hanno notato zahbaz e Arseni Mourzenko, i formati YYYYMMDD ordinano facilmente. Questa non è una coincidenza fortunata, è una diretta conseguenza di mettere prima i campi per la durata più lunga (e di mantenere la lunghezza riparata, stiamo introducendo qui un problema con Y10K).

    
risposta data 25.09.2018 - 11:00
fonte
57

Is there any reason at all?

Sì. Questi software utilizzeranno ISO 8601 .

ISO 8601 ha una serie di vantaggi rispetto ad altri formati di data:

  • È uno standard con un documento spec:)
  • Non è ambiguo. mm / gg / aaaa e gg / mm / aaaa possono confondere a meno che non sia passato il 13 ° giorno.
  • Si ordina lessicograficamente in ordine di tempo crescente, quindi non è richiesta una speciale logica di ordinamento delle date. Ciò è particolarmente utile nei nomi di file, in cui l'ordinamento del numero lessicografico è spesso confuso (ad esempio 1_file, 10_file, 2_file ).
  • Implica l'anno a 4 cifre e il mese e l'anno a zero cifre. Ciò evita il problema dell'anno 2000 e altre ambiguità.

Per quanto riguarda perché ISO 8601 esiste in primo luogo, è perché le persone trovavano i formati di date ambigui e confusi quando si scambiavano dati tra paesi / sistemi e avevano bisogno di qualcosa di non ambiguo.

Per la logica vedi l'introduzione specifica .

Although ISO Recommendations and Standards in this field have been available since 1971, different forms of numeric representation of dates and times have been in common use in different countries. Where such representations are interchanged across national boundaries misinterpretation of the significance of the numerals can occur, resulting in confusion and other consequential errors or losses. The purpose of this International Standard is to eliminate the risk of misinterpretation and to avoid the confusion and its consequences.

...

This International Standard retains the most commonly used expressions for date and time of the day and their representations from the earlier International Standards and provides unique representations for some new expressions used in practice. Its application in information interchange, especially between data processing systems and associated equipment will eliminate errors arising from misinterpretation and the costs these generate. The promotion of this International Standard will not only facilitate interchange across international boundaries, but will also improve the portability of software, and will ease problems of communication within an organization, as well as between organizations.

Lo standard definisce le varianti "base" come minimizzare l'uso dei delimitatori. Quindi, YYYYMMDD è la base alternativa al formato esteso YYYY-MM-DD .

    
risposta data 25.09.2018 - 15:53
fonte
55

È perché tutti gli altri modi per farlo sono ambigui.

01/02/2003 che cosa significa? Gennaio 2003? O in Europa: 1 ° febbraio 2003? Diventa ancora peggio se usi due cifre per l'anno, come il 01/02/03.

Ecco perché utilizzi YYYYMMDD, è la convenzione che ci consente di comunicare chiaramente le date, 20030201 poiché una data è sempre chiara. (e facilita l'ordinamento)

(Ora non immagazzinare quello come l'intero 20 milioni 30.000 2 e 1. per favore ok? carino per favore?)

    
risposta data 25.09.2018 - 02:18
fonte
19

Lascia che t1 e t2 siano interi distinti che rappresentano due volte scritti nella formattazione AAAAMMGG. Quindi t1 < t2 implica che t2 si è verificato dopo t1.

Perderai questo ordine con la prima formattazione di DD e MM.

ISO è, IMO, l'unico formato ragionevole.

    
risposta data 25.09.2018 - 06:31
fonte
12

Un punto non menzionato è che, negli input interattivi, questo formato consente di controllare l'input.

Il sistema non può sapere se un mese ha 28, 29, 30 o 31 giorni senza conoscere l'anno e il mese specifici. Quando l'input interattivo richiede prima l'anno e il mese, può controllare se il giorno (inserito per ultimo) è compreso nell'intervallo consentito.

Certo, la domanda riguardava soprattutto il formato della data, ma si può sostenere che il formato della data segue la formattazione presentata all'utente.

    
risposta data 25.09.2018 - 11:57
fonte
7

YYYYMMDD ordina le date nello stesso modo in cui ordini i numeri: prima la parte più significativa. MMDDYYYY sarebbe come scrivere "centoventitre" come "ventitre e tre".

Nella nostra cultura, abbiamo una comprensione naturale di MMDDYYYY perché, come esseri umani, abbiamo una consapevolezza del tempo e gli anni procedono lentamente. Generalmente sappiamo che anno è. Vedere l'anno raramente conta, quindi lo spingiamo alle spalle. I mesi cambiano abbastanza velocemente da mantenere la loro importanza. Altre culture gestiscono questo modo in modo diverso. Gran parte del mondo preferisce GGMMAAAA.

    
risposta data 25.09.2018 - 06:02
fonte
6

L'ordinamento è stato menzionato ma il motivo più utile per fare è confrontarli come "stringhe", e sì un timestamp di 26 caratteri è ordinato allo stesso modo.

Sono consapevole che tali confronti sono essenziali per l'ordinamento, ma in genere è utile per un ordinamento a 2 elementi.

Ho lavorato su progetti in cui questo non è stato adottato, e sì, i programmatori hanno provato (con risultati misti) a confrontare le date come stringhe.

Una buona formattazione è per il lato client o per la composizione.

    
risposta data 25.09.2018 - 08:40
fonte
5

Questo formato rende l'ordine alfabetico delle stringhe identico all'ordine cronologico delle date. Questo è utile perché molti strumenti forniscono l'ordinamento alfabetico di ad es. file per nome, ma nessun modo per analizzare date formattate in modo arbitrario dai nomi dei file e ordinarle per quelle.

    
risposta data 25.09.2018 - 09:14
fonte
4

Riguarda la restrizione. Immaginate ANNO, MESE e GIORNO come parametri, nel formato AAAAMMGG ogni parametro è più restrittivo di quello precedente.

Quindi, se vuoi cercare qualcosa che è accaduto nel 1970, puoi farlo cercando una stringa che inizia con "1970*" , ma se ricordi in quale mese è stato possibile aggiungere il mese come "197005*" . In questo modo ogni "parametro" della data ti dà informazioni più specifiche.

È l'unico modo per passare da informazioni meno specifiche ( "1970*" ) a informazioni più specifiche ( "19700523" ).

    
risposta data 25.09.2018 - 10:31
fonte
1

Why, in programming, the default date format is YYYYMMDD ...

È un formato leggibile dall'uomo per l'input e l'output, non è necessariamente archiviato in quel modo.

Oltre un terzo di tutti i linguaggi di programmazione sono stati sviluppati in un paese con l'inglese come la lingua principale e la maggior parte di quelli moderni aderiscono ad uno standard di qualche descrizione: lo standard internazionale per le date è ISO 8601 .

Ulteriori informazioni: (TMI?)

Man mano che il tempo cambia, di solito in avanti, i giorni aumentano prima, poi i mesi, infine gli anni - potrebbe essere più facile capire se abbiamo date decimali (e tempo decimale ) - con il passare del tempo il numero aumenta. È semplicemente più semplice per gli umani osservare il numero e confrontarlo con un'altra data a colpo d'occhio.

Il computer non cura quale struttura si desidera utilizzare e nella maggior parte (ma non tutti ) viene utilizzato logica binaria - base e in realtà ha economia di risparmio più bassa , ma non è il più efficient né più semplice per una sequenza completa .

Il formato di effettivo per le date varia in base al paese ed è impostato da localization , mentre YYYYMMDD può sembrare più sensato ed essere quello a cui sei abituato non è universale oggi, né è stato così nel passato per il più lungo tempo, eppure ancora oggi numeri romani sono comunemente usato per le date .

Conoscere l'anno in anticipo ti dice il numero di giorni in un anno, la più grande variazione di durata che un anno può subire. Ti dice in anticipo il numero di giorni in ogni mese da seguire (per il controllo degli errori durante l'inserimento), permettendo l'inserimento del giorno prima potrebbe doverti sostenere se l'anno successivo non fosse d'accordo con il tuo input - probabilmente facendo accessible input più difficile. Ha anche importanza per quanto riguarda il formato del calendario . Vedi anche il calendario geek , con le sue date decimali.

Per quanto riguarda il computer è probabile che utilizzi UNIX Epoch time , il numero di secondi trascorsi dal 00:00:00 Coordinated Universal Time (UTC), giovedì 1 gennaio 1970, in cui ogni giorno viene trattato come se contenga esattamente 86400 secondi. Vedi anche il giorno di Giuliano . Il formato YYYYMMDD è semplicemente preferito dagli esseri umani egocentrici, il IAU considera un anno come un anno giuliano di 365,25 giorni ( 31,5576 milioni di secondi) se non diversamente specificato.

    
risposta data 26.09.2018 - 21:11
fonte
0

Un altro uso che ho visto per questa rappresentazione è che è possibile memorizzare date come numeri interi (cioè in un database), usando solo 4 byte per data. Utilizzando YYYYMMDD significa che i confronti tra interi (spesso una singola istruzione macchina) hanno lo stesso risultato dei confronti nella data rappresentata. E stampa moderatamente umano-leggibile. E niente di tutto ciò richiede alcun codice o supporto speciale, in nessun ambiente di programmazione mainstream.

Se queste cose sono la maggior parte di ciò che devi fare con le date e devi fare molto, allora questo formato ha molto appeal.

Per confronto, le date in formati comuni come GG / MM / AAAA richiedono 10 byte come stringhe di caratteri ASCII. Le stringhe YYYYMMDD lo riducono a 8 e ottengono il "confronto delle rappresentazioni con lo stesso risultato del confronto del vantaggio" delle date, ma anche il confronto basato su stringhe è carattere per carattere piuttosto che un singolo confronto tra interi.

    
risposta data 26.09.2018 - 09:45
fonte
0

La stessa ragione per cui la Luna è fatta di formaggio verde: non lo è. Nella maggior parte dei casi il formato predefinito è una sorta di stringa localizzata. A volte viene utilizzato il formato ISO, ma solitamente con trattini per una migliore leggibilità. YYYYMMDD (o %Y%m%d in strftime parlance) è raramente il valore predefinito. Per essere onesti sono sicuro di averlo visto ma non riesco a pensare ad un esempio in questo momento.

Data Unix (utilità principali GNU)

date

Output:

Wed Sep 26 22:20:57 CEST 2018

Python

import time
print(time.ctime())

uscita:

Wed Sep 26 22:27:20 2018

C

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

int main () {
   time_t curtime;

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

Output:

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);
}

Output:

Wed Sep 26 22:51:22 2018

JavaScript

current_date = new Date ( );
current_date;

Output:

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

SQLite

SELECT date('now');

Output:

2018-09-26

LibreOffice Calc

Gnumeric

onlyoffice

Python+numpy

importnumpyasnppd.datetime64('now')

Output:

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

Python+panda

importpandasaspdpd.Timestamp('now',unit='s')

Output:

Timestamp('2018-09-2621:47:01.277114153')

Ingegneria del software

apport.log

ERROR:apport(pid9742)FriSep2817:39:442018:calledforpid1534,signal6,corelimit0,dumpmode2

alternatives.log

update-alternatives2018-05-0815:14:24:runwith--quiet--install/usr/bin/awkawk/usr/bin/mawk5--slave/usr/share/man/man1/awk.1.gzawk.1.gz/usr/share/man/man1/mawk.1.gz--slave/usr/bin/nawknawk/usr/bin/mawk--slave/usr/share/man/man1/nawk.1.gznawk.1.gz/usr/share/man/man1/mawk.1.gz

tazze/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
    
risposta data 27.09.2018 - 00:07
fonte
-1

Un ulteriore vantaggio non menzionato finora è che la quantizzazione desiderabile (assegnando un valore preciso come appartenente allo stesso intervallo generale di valori) è un'operazione singola relativamente facile e veloce.

Supponiamo che tu stia scrivendo un rapporto che riepiloga gli eventi di oggi, come la somma e il numero di vendite. La data e l'ora di vendita sono memorizzate come YYYYMMDDHHMISS, devi semplicemente mantenere gli 8 caratteri più a sinistra (se si tratta di una stringa) o la divisione intera (ad esempio floor) di 1.000.000 per ridurre il datetime al giorno della vendita.

Allo stesso modo, se desideri le vendite del mese, mantieni solo le 6 cifre più a sinistra, oppure dividi per 100.000.000

Certo, potresti obiettare che qualsiasi manipolazione di stringhe è possibile, un datetime per le vendite di "12-25-2018 12:34 pm" potrebbe essere sottostrato e manipolato più volte per ottenere il mese e l'anno. In formato numerico 122520181234 potrebbe essere diviso e modificato, moltiplicato e diviso un po 'di più, e alla fine anche produrre un mese e un anno .. ..ma il codice sarebbe davvero difficile da scrivere, leggere, mantenere e capire ..

E anche sofisticati ottimizzatori di database potrebbero non essere in grado di utilizzare un indice su una colonna per una clausola where se il modulo data era MM / GG / AAAA ma tagliato e rimontato insieme. In confronto, la memorizzazione di una rappresentazione YYYYMMDD e la volontà di dicembre 2018 porta a dove clausole del ilk dateasstring LIKE '201812%' o dateasint BETWEEN 20181200 and 20181299 - qualcosa che un indice può essere facilmente utilizzato per

Quindi, se non ci fosse un datatype dedicato per le date e la rappresentazione stringa / numerica fosse l'unica scelta, usando e memorizzando i tempi in qualche rappresentazione dell'intervallo più lungo-da-sinistra-a-intervallo-breve-su -the-right ha alcuni vantaggi per la facilità di comprensione, manipolazione, memorizzazione, recupero e manutenzione del codice

    
risposta data 27.09.2018 - 22:40
fonte

Leggi altre domande sui tag