Existe alguma razão técnica para que, na programação, o formato de data padrão seja YYYYMMDD e não algo diferente?

116

Existe algum motivo de engenharia por que é assim? Fiquei me perguntando no caso de um RDBMS que tinha algo a ver com performance, já que um "YEAR" é mais específico que um "MONTH", por exemplo: você só tem um ano 2000, mas todo ano tem "janeiro", o que tornaria mais fácil / rápido filtrar / classificar algo no primeiro ano, e é por isso que o ano vem em primeiro lugar.

Mas eu não sei se isso realmente faz sentido ... Existe algum motivo?

    
por lucaswxp 25.09.2018 / 00:43
fonte

14 respostas

379

Dessa forma, as datas podem ser facilmente classificadas como strings usando as regras de classificação padrão (ou seja, classificação lexicográfica ).

É também por isso que o mês e o dia são especificados usando dois dígitos (adicionando um zero à esquerda, se necessário).

Na verdade, é um dos formatos de data definidos pela ISO 8601 . Esse padrão também define um formato de data e hora, 2015-03-27T15:26:40Z , que também pode ser classificado como strings.

No entanto, AAAAMMDD tem um benefício adicional de tornar possível facilmente (nenhuma substrings ou substituições de caracteres envolvidas) analisar a cadeia como um inteiro e ainda usar ordenação padrão em inteiros.

    
por 25.09.2018 / 00:49
fonte
131

Não mencionado ainda, mas você rapidamente encobre a ordem dentro YYYY. Isso já é milênios, séculos, décadas, anos. Ou seja, YYYY já está ordenado do período mais longo para o período mais curto. O mesmo vale para MM e DD, é assim que funciona o sistema numérico.

Portanto, para manter os campos entre consistentes com os campos dentro , a única opção é YYYYMMDD.

Como Zahbaz e Arseni Mourzenko notaram, os formatos AAAAMMDD são facilmente classificados. Isso não é uma coincidência de sorte, isso é uma conseqüência direta de colocar os campos por mais tempo primeiro (e manter o tamanho fixo; estamos introduzindo um problema Y10K aqui.)

    
por 25.09.2018 / 11:00
fonte
57

Is there any reason at all?

Sim. Esses softwares usarão a ISO 8601 .

A ISO 8601 tem várias vantagens sobre outros formatos de data:

  • É um padrão com um documento específico:)
  • Não é ambíguo. mm / dd / aaaa e dd / mm / aaaa podem ser confusos, a menos que tenha passado do 13º dia.
  • É ordenado lexicograficamente em ordem crescente de tempo, portanto, nenhuma lógica especial de classificação de datas é necessária. Isso é especialmente útil em nomes de arquivos, em que a classificação numérica lexicográfica é muitas vezes confusa (por exemplo, 1_file, 10_file, 2_file ).
  • Ele exige um ano de 4 dígitos e zero mês e ano preenchidos. Isso evita o problema do ano 2000 e outras ambiguidades.

Já que porque a ISO 8601 existe, é porque as pessoas achavam os formatos de datas ambíguos e confusos ao trocar dados entre países / sistemas, e precisavam de algo sem ambigüidade.

Para o raciocínio, veja a introdução da

.

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.

O padrão define variações “básicas” como minimizando o uso de delimitadores. Portanto, YYYYMMDD é a alternativa básica para o formato estendido YYYY-MM-DD .

    
por 25.09.2018 / 15:53
fonte
55

É porque todas as outras maneiras de fazer isso são ambíguas.

01/02/2003 o que isso significa? 2 de janeiro de 2003? Ou na Europa: 1º de fevereiro de 2003? Fica ainda pior se você usar dois dígitos para o ano, como 01/02/03.

É por isso que você usa YYYYMMDD, é a convenção que nos permite comunicar claramente sobre datas, 20030201 como uma data é sempre clara. (e isso facilita a classificação)

(Agora não vá guardar isso como o inteiro 20 milhões 30 mil 2 cem e 1. por favor ok? bonito por favor?)

    
por 25.09.2018 / 02:18
fonte
19

Seja t1 e t2 inteiros distintos que representam duas vezes escritos na formatação de AAAAMMDD. Então t1 < t2 implica que t2 ocorreu após t1.

Você perde essa ordem com a formatação inicial de DD e MM.

ISO é, IMO, o único formato sensato.

    
por 25.09.2018 / 06:31
fonte
12

Um ponto não mencionado é que, em entradas interativas, este formato permite controlar a entrada.

O sistema não pode saber se um mês tem 28, 29, 30 ou 31 dias sem saber o ano e o mês específicos. Quando a entrada interativa determina que ano e mês vêm em primeiro lugar, pode verificar se o dia (inserido por último) está no intervalo permitido.

Concedido, a questão era em grande parte sobre o formato da data, mas pode-se argumentar que o formato da data segue a formatação apresentada ao usuário.

    
por 25.09.2018 / 11:57
fonte
7

AAAAMMDD ordena as datas da mesma forma que você solicita números: a parte mais significativa primeiro. MMDDYYYY seria como escrever "cento e vinte e três" como "vinte e cento e três".

Em nossa cultura, temos uma compreensão natural do MMDDYYYY porque, como seres humanos, temos uma consciência do tempo, e os anos progridem lentamente. Nós geralmente sabemos que ano é. Vendo o ano raramente importa, então nós o empurramos para trás. Os meses mudam rápido o suficiente para manter sua importância. Outras culturas lidam com isso de maneira diferente. Grande parte do mundo prefere DDMMYYYY.

    
por 25.09.2018 / 06:02
fonte
6

A classificação foi mencionada, mas de longe a razão mais útil para fazer é compará-las como "strings", e sim um timestamp de 26 caracteres é ordenado de forma semelhante.

Estou ciente de que tais comparações são essenciais para a classificação, mas geralmente é útil para um tipo de 2 elementos.

Eu trabalhei em projetos onde isso não foi adotado, e sim, programadores tentaram (com resultados mistos) comparar as datas como strings.

A formatação bonita é para o lado do cliente ou para composição de texto.

    
por 25.09.2018 / 08:40
fonte
5

Este formato faz a ordem alfabética das cadeias idêntica à ordem cronológica das datas. Isto é útil porque muitas ferramentas fornecem ordenação alfabética de, e. arquivos por nome, mas nenhuma maneira de analisar datas formatadas arbitrariamente a partir de nomes de arquivos e ordenar por elas.

    
por 25.09.2018 / 09:14
fonte
4

É sobre restritividade. Imagine YEAR, MONTH e DAY como parâmetros, no formato YYYYMMDD, cada parâmetro é mais restritivo que o anterior.

Então, se você quiser pesquisar algo que aconteceu em 1970, poderá fazer isso pesquisando uma string começando por "1970*" , mas se lembrar qual mês foi possível adicionar o mês como "197005*" . Desta forma, todos os "parâmetros" da data fornecem informações mais específicas.

É a única maneira de ir de informações menos específicas ( "1970*" ) para informações mais específicas ( "19700523" ).

    
por 25.09.2018 / 10:31
fonte
1

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

É um formato legível para entrada e saída, não é necessariamente armazenado dessa maneira.

Mais de um terço de todas as linguagens de programação foram desenvolvidas em um país com inglês como o idioma principal e a maioria dos modernos seguem um Padrão de alguma descrição - o padrão internacional para datas é ISO 8601 .

Mais informações: (TMI?)

À medida que o tempo muda, geralmente para a frente, os dias são incrementados primeiro, depois meses, últimos anos - pode ser mais fácil entender se tivermos datas decimais (e tempo decimal ) - à medida que o tempo passa, o número fica maior. É simplesmente mais fácil para os humanos olharem para o número e compará-lo a outra data de uma só vez.

O computador não cuida da estrutura que você quer usar e na maioria (mas não todos os computadores ) lógica binária é usado - base e na verdade tem a menor economia de raiz mas não é a mais eficiente nem mais fácil para uma sequência completa .

O formato real de entrada e saída para datas varia de acordo com o país e é definido por localization , enquanto YYYYMMDD pode parecer fazer mais sentido e ser o que você está acostumado com isso não é universal hoje, nem foi assim no passado por muito tempo, ainda hoje mesmo algarismos romanos são comumente usado para datas .

Conhecer o ano adiantado informa o número de dias em um ano, a maior variação na duração que um ano pode sofrer. Diz-lhe antecipadamente o número de dias em cada mês a seguir (para verificação de erros durante a entrada), permitindo que a entrada do primeiro dia possa ter de o apoiar se o ano subsequente não concordar com a sua contribuição - possivelmente tornando accessível é mais difícil. Ele também tem importância em relação ao formato de calendário . Veja também o calendário geek , com seus stardates decimais.

No que diz respeito ao computador, é provável que ele use Tempo de Época do UNIX , o número de segundos decorridos desde 00:00:00 Tempo Universal Coordenado (UTC), quinta-feira, 1 de janeiro de 1970, em que todos os dias são tratados como se contivessem exatamente 86400 segundos. Veja também o dia juliano . O formato AAAAMMDD é simplesmente preferido por seres humanos egocêntricos, o IAU considera um ano como um ano juliano de 365,25 dias ( 31,5576 milhões de segundos), salvo indicação em contrário.

    
por 26.09.2018 / 21:11
fonte
0

Outro uso que já vi para essa representação é que você pode armazenar datas como inteiros (ou seja, em um banco de dados), usando apenas 4 bytes por data. O uso de YYYYMMDD significa que as comparações de inteiros (geralmente uma única instrução de máquina) têm o mesmo resultado que as comparações na data representada. E imprime de forma moderadamente humana. E nada disso requer qualquer código ou suporte especial, em qualquer ambiente de programação mainstream.

Se essas coisas são mais do que você precisa fazer com datas, e você precisa fazer muito disso, então esse formato tem muito apelo.

Por comparação, datas em formatos comuns como DD / MM / AAAA levam 10 bytes como sequências de caracteres ASCII. As strings YYYYMMDD reduzem isso para 8 e ganham a vantagem de "comparar as representações tem o mesmo resultado que comparar as datas", mas mesmo assim a comparação baseada em string é caractere por caractere ao invés de uma comparação de inteiros.

    
por 26.09.2018 / 09:45
fonte
0

Mesma razão pela qual a Lua é feita de queijo verde: não é. Na maioria dos casos, o formato padrão é algum tipo de string localizada. Às vezes, o formato ISO é usado, mas geralmente com traços para melhor legibilidade. YYYYMMDD (ou %Y%m%d in strftime linguagem) raramente é o padrão. Para ser justo, tenho certeza de que já vi, mas não consigo pensar em um exemplo agora.

Data do Unix (utilitários principais do GNU)

date

Saída:

Wed Sep 26 22:20:57 CEST 2018

Python

import time
print(time.ctime())

saída:

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

Saída:

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

Saída:

Wed Sep 26 22:51:22 2018

Javascript

current_date = new Date ( );
current_date;

Saída:

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

SQLite

SELECT date('now');

Saída:

2018-09-26

LibreOffice Calc

Gnumeric

OnlyOffice

Python+numpy

importnumpyasnppd.datetime64('now')

Saída:

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

Python+pandas

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

Saída:

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

Engenharia de 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

cups/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
    
por 27.09.2018 / 00:07
fonte
-1

Um benefício adicional não mencionado até agora é que a quantização desejável (atribuir um valor preciso como pertencente ao mesmo intervalo geral de valores) é uma operação simples relativamente fácil e rápida.

Suponha que você esteja escrevendo um relatório que resuma os eventos hoje, como a soma e o número de vendas. A data e hora de venda são armazenadas como YYYYMMDDHHMISS, basta manter os 8 caracteres mais à esquerda (se for uma string) ou dividir inteiro (ou seja, andar) em 1.000.000 para reduzir a data / hora para o dia da venda.

Da mesma forma, se você quiser as vendas do mês, mantenha apenas os 6 dígitos mais à esquerda ou divida por 100.000.000

Claro, você poderia argumentar que qualquer manipulação de string é possível, um datetime para vendas de "12-25-2018 12:34 pm" poderia ser substringed e manipulado várias vezes para obter o mês e o ano. Na forma numérica 122520181234 poderia ser dividido e modificado, multiplicado e dividido um pouco mais e, eventualmente, também produzir um mês e um ano. ..mas o código seria muito difícil de escrever, ler, manter e entender ..

E mesmo otimizadores de banco de dados sofisticados podem não conseguir usar um índice em uma coluna para uma cláusula where se o formulário de data for MM / DD / AAAA, mas recortados e reconstituídos. Em comparação, armazenar uma representação YYYYMMDD e querer dezembro de 2018 leva a cláusulas where do tipo dateasstring LIKE '201812%' ou dateasint BETWEEN 20181200 and 20181299 - algo que um índice pode ser facilmente usado para

Portanto, se não houvesse um tipo de dados dedicado para datas e representação string / numérica, a única opção seria usar e armazenar tempos em alguma representação de intervalo mais longo à esquerda para intervalo mais curto. -a-direita tem alguns benefícios para facilitar a compreensão, manipulação, armazenamento, recuperação e manutenção de código

    
por 27.09.2018 / 22:40
fonte