Para algunos sistemas, el valor de tiempo 9999-12-31 se usa como el "fin del tiempo" como el final del tiempo que la computadora puede calcular. Pero, ¿y si cambia? ¿No sería mejor definir esta vez como una variable integrada?
En C y otros lenguajes de programación, generalmente hay una variable como MAX_INT
o similar para obtener el mayor valor que un entero podría tener. ¿Por qué no hay una función similar para, por MAX_TIME
ejemplo, establecer la variable al "fin de los tiempos", que para muchos sistemas suele ser 9999-12-31. Para evitar el problema de codificar un año equivocado (9999), ¿podrían estos sistemas introducir una variable para el "fin de los tiempos"?
** Ejemplo real **
End of validity date: 31/12/9999.
(Los documentos oficiales se enumeran así) El blogger quiere escribir una página que siempre esté en la parte superior, la página de bienvenida. Entonces se le da una fecha lo más lejos posible en el futuro:
3000? Sí, la página de bienvenida a la que se enfrenta se publicará el 1 de enero de 3000. Por lo tanto, esta página se mantendrá en la parte superior del blog para siempre =) En realidad se publicó el 31 de agosto de 2007.
Respuestas:
Pregúntese por qué necesita esa variable en primer lugar.
Lo más probable es que mienta sobre sus datos: cuando necesita una variable de "fin de los tiempos", no se refiere al final de los tiempos; más bien está expresando cosas como "no hay límite superior para esta fecha", "este evento continúa indefinidamente" o similar.
La solución correcta, entonces, es expresar estas intenciones directamente en lugar de depender de un valor mágico: use tipos de fecha anulables (donde
null
indica "sin fecha de finalización establecida"), agregue un campo booleano "indefinido", use un envoltorio polimórfico (que puede sea una fecha real o un valor "indefinido" especial), o lo que su lenguaje de programación tenga para ofrecer.Por supuesto, la solución correcta no siempre es factible, por lo que podría terminar usando un valor mágico después de todo, pero cuando lo haga, tendrá que decidir un valor adecuado en función de cada caso, ya que las fechas sí y no tiene sentido depende del dominio que esté modelando: si está almacenando marcas de tiempo de registro, 01/01/2999 es un razonable "fin de los tiempos"; Las posibilidades de que su aplicación siga siendo utilizada dentro de 1000 años son, creo, prácticamente nulas. Consideraciones similares se aplican a las aplicaciones de calendario. Pero, ¿qué pasa si su software es para manejar datos científicos, por ejemplo, predicciones a largo plazo sobre el clima de la Tierra? Esos podrían realmente querer mirar mil años en el futuro. O dé un paso más allá; astronomía, un campo donde es perfectamente normal razonar en períodos de tiempo muy largos del orden de miles de millones de años, tanto en el camino como en el futuro. Para aquellos, 01/01/2999 es un máximo arbitrario perfectamente ridículo. OTOH, un sistema de calendario que puede manejar períodos de tiempo de diez billones de años en el futuro no es práctico para un sistema de seguimiento de citas con el dentista, aunque solo sea por la capacidad de almacenamiento.
En otras palabras, no hay una mejor opción para un valor que sea incorrecto y arbitrario por definición, para empezar. Es por eso que es muy raro ver uno definido en cualquier lenguaje de programación; aquellos que generalmente no lo llaman "fin de los tiempos", sino más bien algo como
DATE_MAX
(oDate.MAX
), y lo toman como "el mayor valor que puede almacenarse en el tipo de datos de fecha", no "el fin de los tiempos" o "indefinidamente".fuente
null
en este caso no se usa como un valor especial, se usa como el significado correcto denull
"falta". Entonces, si su campo esExpiryDate
, que es más correcto:null
(lo que significa que no hay fecha de vencimiento) oEND_OF_TIME
(que no existe, hasta donde sabemos). Claramentenull
oNoValue
algo similar es la mejor solución.Como industria, hemos sido notoriamente miopes y arbitrarios en la búsqueda de salvar algunos bytes, por ejemplo
31 dic 99En mi humilde opinión, la mejor opción es permanecer con un nivel de abstracción apropiado y general en la 'fecha máxima', y esperar que una solución común haya abordado el problema antes de que llegue el momento.
por ejemplo, en .NET, DateTime.MaxValue es arbitrariamente
23:59:59.9999999, December 31, 9999, exactly one 100-nanosecond tick before 00:00:00, January 1, 10000
. Entonces, si mis suposiciones sobre mi propia longevidad son falsas, y llega el año 10000, espero que se recompile mi aplicación con una versión posterior del marcoDateTime.MaxValue
(por ejemplo, cambiando su tipo subyacente) a un nuevo valor arbitrario y patear el problema más adelante por otros milenios.Editar
(Reforzar el punto de Tdammers de que, en lugar de falsificar una fecha artificial, es más correcto resaltar explícitamente el hecho al consumidor de que no tenemos una fecha de finalización).
Como alternativa al uso
null
, que tiene la consecuencia negativa de ser compatible con cualquier tipo de referencia (incluido .Net Nullable`), lo que probablemente causará problemas de NRE en los consumidores que se olvidan de verificar, en idiomas FP, es común usar un Opción o Quizás Escriba wrapper alrededor de un valor que puede o no devolverse.Pseudocódigo:
El beneficio de hacer esto es que obliga al consumidor a razonar sobre ambos casos. La coincidencia de patrones también es común aquí:
fuente
NaT
" valores, etc.Probablemente quieras una
algebraic data type
variante con infinita grandedate
. Luego defina la comparación, en la cual lainfinite
variante siempre será más grande que cualquier otradate
.Ejemplo en Scala:
http://ideone.com/K5Kuk
fuente
Almacene sus tiempos como un número de coma flotante de precisión doble IEE754 de 64 bits, y puede usar
+INF
. No use precisión simple, solo tiene una precisión de 7 dígitos, lo cual es un poco bajo para una fecha.fuente
Cocoa / Objective-C tiene métodos de fábrica [NSDate distantPast] y [NSDate distantFuture] que representan exactamente el tipo de cosas a las que se refiere.
Los valores devueltos por la implementación actual son constantes que representan alrededor del año 0 DC y 4000 DC, aunque no están garantizados ni documentados.
fuente
Generalmente no existe tal valor, porque no sería útil como una construcción de lenguaje.
MAX_INT
y es parentesco todos sirven un propósito. Se pueden usar en su código para verificar si hay desbordamientos. Esto es útil si va a crear y administrar objetos de datos grandes en matrices, vectores, lo que sea. También es un valor bastante específico de la plataforma.El caso de uso de un
MAX_DATE
valor es más difícil de ver. Por lo general, estos son solo valores, no se usan como parte de la estructura del programa y, por lo tanto, el valor que circula no tendría consecuencias desastrosas para el programa (aunque puede serlo para los datos). Además, los tipos de fecha y hora en C, C ++, etc. generalmente se definen más estrictamente; y para que las personas que escriben el programa no tengan que preocuparse de que pueda cambiar entre plataformas.fuente
En un proyecto que hicimos, tuvimos una situación en la que el dimensionamiento de alguna base de datos se realizó de una manera que no sería sostenible después de 30 años de uso del software. Cuando el cliente le preguntó a nuestro ingeniero principal en ese momento: "Bueno, ¿qué haremos después de 30 años de usar su software?" Nuestro ingeniero principal, genial como un pepino, respondió encogiéndose de hombros: "¡Vamos a tomar una cerveza!"
El punto es, solo usa la fecha que esté lo suficientemente lejos en el futuro. Es probable que su software se actualice o reemplace para entonces. :)
fuente