¿Hay alguna razón técnica por la que, en la programación, el formato de fecha predeterminado sea YYYYMMDD y no otra cosa?

116

¿Hay alguna razón de ingeniería por la que sea así? Me preguntaba en el caso de un RDBMS que tenía algo que ver con el rendimiento, ya que un "AÑO" es más específico que un "MES", por ejemplo: solo tienes un año 2000, pero todos los años tienen "Enero", lo que haría más fácil / rápido filtrar / ordenar algo por año primero, y es por eso que el año es lo primero.

Pero no sé si eso realmente tiene sentido ... ¿Hay alguna razón en absoluto?

    
pregunta lucaswxp 25.09.2018 - 00:43
fuente

14 respuestas

379

De esta manera, las fechas pueden ordenarse fácilmente como cadenas utilizando las reglas de clasificación predeterminadas (es decir, clasificación lexicográfica ).

Esta es también la razón por la que tanto el mes como el día se especifican con dos dígitos (agregando un cero inicial si es necesario).

De hecho, es uno de los formatos de fecha definidos por ISO 8601 . Ese estándar también define un formato de fecha y hora, 2015-03-27T15:26:40Z , que también se puede clasificar como cadenas.

Sin embargo, YYYYMMDD tiene la ventaja añadida de hacer posible fácilmente (sin subcadenas o reemplazos de caracteres involucrados) analizar la cadena como un número entero, y seguir utilizando el orden predeterminado en los números enteros.

    
respondido por el Arseni Mourzenko 25.09.2018 - 00:49
fuente
131

Aún no se ha mencionado, pero rápidamente pasa por alto el orden que hay dentro YYYY. Eso es ya milenios, siglos, décadas, años. Es decir, YYYY ya está ordenado desde el período más largo hasta el más corto. Lo mismo ocurre con MM y DD, así es como funciona el sistema numérico.

Por lo tanto, para mantener el orden entre los campos de manera consistente con el orden dentro de los campos , la única opción es AAAAMMDD.

Como señalaron zahbaz y Arseni Mourzenko, los formatos YYYYMMDD se clasifican fácilmente. Esa no es una coincidencia afortunada, es una consecuencia directa de poner primero los campos de la duración más larga (y mantener la longitud fija; aquí presentamos un problema de Y10K).

    
respondido por el MSalters 25.09.2018 - 11:00
fuente
57
  

¿Hay alguna razón en absoluto?

Sí. Esas piezas de software utilizarán ISO 8601 .

ISO 8601 tiene varias ventajas sobre otros formatos de fecha:

  • Es un estándar con un documento de especificaciones :)
  • Es inequívoco. mm / dd / aaaa y dd / mm / aaaa pueden ser confusos a menos que hayan pasado el día 13.
  • Se clasifica de forma lexicográfica en orden ascendente de tiempo, por lo que no se requiere una lógica especial de clasificación de fechas. Esto es especialmente útil en los nombres de archivo, donde la clasificación de números lexicográficos suele ser confusa (por ejemplo, 1_file, 10_file, 2_file ).
  • Ordena un año y un año rellenados de 4 dígitos y cero. Esto evita el problema del año 2000 y otras ambigüedades.

En cuanto a por qué ISO 8601 existe en primer lugar, es porque la gente encontraba los formatos de fecha ambiguos y confusos cuando intercambiaban datos entre países / sistemas, y necesitaban algo inequívoco.

Para obtener información sobre la justificación, consulte la spec de la introducción.

  

Aunque las Recomendaciones y Normas ISO en este campo han estado disponibles desde 1971, diferentes formas de   La representación numérica de fechas y horas ha sido de uso común en diferentes países. Donde tal   Las representaciones se intercambian a través de las fronteras nacionales. La interpretación errónea de la importancia de los números puede   ocurrir, lo que resulta en confusión y otros errores o pérdidas consecuentes. El propósito de esta Norma Internacional es   elimine el riesgo de una mala interpretación y evite la confusión y sus consecuencias.

     

...

     

Esta Norma Internacional conserva las expresiones más utilizadas para la fecha y la hora del día y sus   representaciones de los estándares internacionales anteriores y proporciona representaciones únicas para algunos nuevos   Expresiones utilizadas en la práctica. Su aplicación en el intercambio de información, especialmente entre sistemas de procesamiento de datos.   y el equipo asociado eliminará los errores que surjan de una mala interpretación y los costos que estos generan. los   La promoción de esta Norma Internacional no solo facilitará el intercambio a través de las fronteras internacionales, sino que también   También mejorará la portabilidad del software y facilitará los problemas de comunicación dentro de una organización, así como también   entre organizaciones.

El estándar define variaciones "básicas" como minimizando el uso de delimitadores. Entonces, YYYYMMDD es la básica alternativa al formato extendido YYYY-MM-DD .

    
respondido por el Pod 25.09.2018 - 15:53
fuente
55

Es porque todas las otras formas de hacerlo son ambiguas.

01/02/2003 ¿Qué significa eso? Enero segundo 2003? ¿O en Europa: 1 de febrero de 2003? Se pone aún peor si usa dos dígitos para el año, como 01/02/03.

Es por eso que usa YYYYMMDD, es la convención que nos permite comunicar claramente acerca de las fechas, 20030201 como fecha siempre está clara. (y facilita la clasificación)

(Ahora no vayas a guardar eso como el número entero 20 millones 30 mil 2 cientos y 1. ¿de acuerdo? ¿Bastante, por favor?)

    
respondido por el Pieter B 25.09.2018 - 02:18
fuente
19

Sean t1 y t2 enteros distintos que representan dos veces escritas en formato YYYYMMDD. Entonces t1 < t2 implica que t2 ocurrió después de t1.

Pierde este pedido con el formato DD y MM primero.

ISO es, IMO, el único formato sensible.

    
respondido por el zahbaz 25.09.2018 - 06:31
fuente
12

Un punto que no se menciona es que, en las entradas interactivas, este formato permite controlar la entrada.

El sistema no puede saber si un mes tiene 28, 29, 30 o 31 días sin saber el año y el mes específicos. Cuando los mandatos de entrada interactiva de ese año y mes son los primeros, se puede verificar si el día (el último insertado) está dentro del rango permitido.

Por supuesto, la pregunta fue en gran parte sobre el formato de fecha, pero se puede argumentar que el formato de fecha sigue el formato presentado al usuario.

    
respondido por el Martin 25.09.2018 - 11:57
fuente
7

YYYYMMDD ordena las fechas de la misma manera que usted ordena los números: la porción más significativa primero. MMDDYYYY sería como escribir "ciento veintitrés" como "veinte y ciento tres".

En nuestra cultura, tenemos un entendimiento natural de MMDDYYYY porque, como seres humanos, tenemos conciencia del tiempo y los años avanzan lentamente. En general, sabemos qué año es. Ver el año rara vez importa, así que lo empujamos hacia atrás. Los meses cambian lo suficientemente rápido como para mantener su importancia. Otras culturas manejan esto de manera diferente. Gran parte del mundo prefiere DDMMYYYY.

    
respondido por el Joel Coehoorn 25.09.2018 - 06:02
fuente
6

Se ha mencionado la ordenación, pero la razón más útil para hacer esto es compararlos como "cadenas", y sí, una marca de tiempo de 26 caracteres está ordenada de manera similar.

Soy consciente de que tales comparaciones son esenciales para la clasificación, pero generalmente es útil para una clasificación de 2 elementos.

He trabajado en proyectos donde esto no se adoptó, y sí, los programadores intentaron (con resultados mixtos) comparar las fechas como cadenas.

El formato bonito es para el lado del cliente o la tipografía.

    
respondido por el mckenzm 25.09.2018 - 08:40
fuente
5

Este formato hace que el orden alfabético de las cadenas sea idéntico al orden cronológico de las fechas. Esto es útil porque muchas herramientas proporcionan un orden alfabético de, por ejemplo, archivos por nombre, pero no hay manera de analizar fechas con formato arbitrario a partir de los nombres de los archivos y ordenar por esos.

    
respondido por el WolfgangGroiss 25.09.2018 - 09:14
fuente
4

Se trata de la restricción. Imagine YEAR, MONTH y DAY como parámetros, en el formato YYYYMMDD cada parámetro es más restrictivo que el anterior.

Entonces, si desea buscar algo que sucedió en 1970, puede hacerlo buscando una cadena que comience por "1970*" , pero si recuerda qué mes fue, puede agregar el mes como "197005*" . De esta manera, cada "parámetro" de la fecha le brinda información más específica.

Es la única forma de pasar de información menos específica ( "1970*" ) a información más específica ( "19700523" ).

    
respondido por el mrvinent 25.09.2018 - 10:31
fuente
1
  

Por qué, en la programación, el formato de fecha predeterminado es AAAAMMDD ...

Es un formato legible por humanos para entrada y salida, no necesariamente se almacena de esa manera.

Over a third de todos los lenguajes de programación se desarrollaron en un país con el inglés como El idioma principal y la mayoría de los modernos se adhieren a un Estándar de alguna descripción: el Estándar internacional para fechas es ISO 8601 .

Más información: (TMI?)

A medida que el tiempo cambia, usualmente hacia adelante, los días se incrementan primero, luego los meses, por último los años, podría ser más fácil de entender si tuviéramos fechas decimales (y tiempo decimal ): a medida que el tiempo pasa, el número aumenta. Es simplemente más fácil para los humanos ver el número y compararlo con otra fecha de un vistazo.

La computadora no le importa la estructura que desea utilizar y en la mayoría (pero no todas ) computadoras lógica binaria se utiliza - base e en realidad tiene la economía de radix más baja pero no es la más eficiente ni más fácil para una secuencia completa .

El formato de entrada y salida real para fechas varía según el país y se establece en localization , mientras que YYYYMMDD parece tener más sentido y es lo que estás acostumbrado a utilizar no es universal hoy, ni fue así en el pasado por más tiempo, sin embargo, incluso hoy en día los números romanos son comúnmente usado para fechas .

Conocer el año por adelantado le informa la cantidad de días en un año, la mayor variación en la duración que un año puede someterse. Le indica por adelantado la cantidad de días que debe seguir en cada mes (para la verificación de errores durante la entrada), lo que permite que el primer día tenga que respaldarlo si el año siguiente no estuvo de acuerdo con su opinión, posiblemente haciendo acccessible más difícil. También tiene importancia con respecto al formato de calendario . Consulte también el calendario geek , con sus fechas decimales.

En lo que respecta a la computadora, es probable que use Tiempo de época de UNIX , el número de segundos que han transcurrido desde 00:00:00 Hora Universal Coordinada (UTC), jueves 1 de enero de 1970, donde cada día se trata como si contuviera exactamente 86400 segundos. Consulte también el día juliano . El formato AAAAMMDD es simplemente preferido por los humanos egocéntricos, IAU considera un año como un año Juliano de 365.25 días ( 31.5576 millones de segundos) a menos que se especifique lo contrario.

    
respondido por el Rob 26.09.2018 - 21:11
fuente
0

Otro uso que he visto para esta representación es que puede almacenar fechas como números enteros (es decir, en una base de datos), utilizando solo 4 bytes por fecha. El uso de YYYYMMDD significa que las comparaciones de enteros (a menudo una sola instrucción de máquina) tienen el mismo resultado que las comparaciones en la fecha representada. Y se imprime moderadamente humana-legiblemente. Y nada de esto requiere ningún código o soporte especial, en ningún entorno de programación convencional.

Si esas cosas son la mayoría de lo que necesita hacer con las fechas, y necesita hacer muchas de ellas, este formato es muy atractivo.

En comparación, las fechas en formatos comunes como DD / MM / YYYY toman 10 bytes como cadenas de caracteres ASCII. Las cadenas YYYYMMDD reducen eso a 8 y obtienen la ventaja de "comparar las representaciones tiene el mismo resultado que comparar las fechas", pero incluso entonces la comparación basada en cadenas es carácter por carácter en lugar de una única comparación de enteros.

    
respondido por el Ben 26.09.2018 - 09:45
fuente
0

La misma razón por la que la Luna está hecha de queso verde: no lo es. En la mayoría de los casos, el formato predeterminado es algún tipo de cadena localizada. Algunas veces se usa el formato ISO pero generalmente con guiones para una mejor legibilidad. YYYYMMDD (o %Y%m%d en strftime parlance) rara vez es el valor predeterminado. Para ser justos, estoy seguro de que lo he visto, pero no puedo pensar en un ejemplo en este momento.

Fecha de Unix (utilidades principales de GNU)

date

Salida:

Wed Sep 26 22:20:57 CEST 2018

Python

import time
print(time.ctime())

salida:

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

Salida:

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

Salida:

Wed Sep 26 22:51:22 2018

Javascript

current_date = new Date ( );
current_date;

Salida:

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

SQLite

SELECT date('now');

Salida:

2018-09-26

LibreOffice Calc

Gnumeric

OnlyOffice

Python+numpy

importnumpyasnppd.datetime64('now')

Salida:

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

Python+pandas

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

Salida:

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

Ingeniería de software

apport.log

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

alternative.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
    
respondido por el Goyo 27.09.2018 - 00:07
fuente
-1

Un beneficio adicional que no se menciona hasta ahora es que la cuantificación deseable (asignar un valor preciso como perteneciente al mismo rango general de valores) es una operación simple, relativamente fácil y rápida.

Suponga que está escribiendo un informe que resume los eventos de hoy, como la suma y el número de ventas. La fecha y hora de la venta se almacenan como AAAAMMDDHHMISS, simplemente debe mantener los 8 caracteres más a la izquierda (si es una cadena) o la división de enteros (es decir, el piso) por 1,000,000 para reducir su fecha y hora al día de la venta.

De manera similar, si deseaba las ventas del mes, solo conserva los 6 dígitos más a la izquierda, o divide por 100,000,000

Claro, podría argumentar que cualquier manipulación de cadena es posible, una fecha y hora para las ventas de "12-25-2018 12:34 pm" se puede subcadenar y manipular varias veces para obtener el mes y el año. En forma numérica, 122520181234 podría dividirse y modificarse, multiplicarse y dividirse un poco más, y eventualmente también producir un mes y un año. ..pero el código sería realmente difícil de escribir, leer, mantener y entender ...

Incluso los optimizadores de bases de datos sofisticados podrían no ser capaces de utilizar un índice en una columna para una cláusula where si el formato de la fecha era MM / DD / YYYY, pero se recortaron y se reconstruyeron. En comparación, el almacenamiento de una representación AAAAMMDD y el deseo de diciembre de 2018 conduce a donde las cláusulas de ilk dateasstring LIKE '201812%' o dateasint BETWEEN 20181200 and 20181299 , algo para lo que se puede usar fácilmente un índice

Por lo tanto, si no hubiera un tipo de datos dedicado para las fechas y la representación de cadena / numérica era la única opción, usar y almacenar los tiempos en alguna representación del intervalo más largo en el intervalo de la izquierda al más corto. -la derecha tiene bastantes beneficios para la facilidad de comprensión, manipulación, almacenamiento, recuperación y mantenimiento del código

    
respondido por el Caius Jard 27.09.2018 - 22:40
fuente

Lea otras preguntas en las etiquetas