¿Hay una constante para el "fin de los tiempos"?

12

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_INTo similar para obtener el mayor valor que un entero podría tener. ¿Por qué no hay una función similar para, por MAX_TIMEejemplo, 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.

Niklas
fuente
66
¿Por qué? Esto parece un problema que podría resolverse implementando un algoritmo o estructura de datos correctos.
Eufórico
16
Supongo que la mayoría de la gente todavía no está muy preocupada por el problema Y10K :-) Especialmente como antes, estamos obligados a tener un problema Y2038 , y probablemente un par más ...
Péter Török
2
@ Thorbjörn, sí, probablemente la mayoría de los sistemas en vivo se habrán migrado para entonces. Sin embargo, todavía puede haber una cantidad inestimable de sistemas embebidos antiguos, bases de datos heredadas, archivos en formatos obsoletos, etc.
Péter Török
14
Creo que el calendario maya tiene una constante de "fin de los tiempos" = 2012-12-21 ;-)
nikie
3
Nadie sabe cuándo será el "fin de los tiempos".
Tulains Córdova

Respuestas:

47

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 nullindica "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(o Date.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".

tdammers
fuente
20
usar nulo para significar un valor especial no es realmente mejor que usar ese valor especial
Ryathal
2
@Ryathal Bueno, creo que no hay 'nullenium' bug, por lo que es al menos un poco mejor ...
K.Steff
8
@Ryathal: en realidad no lo es. Hay muchas acciones que puede realizar en un número mágico que no puede realizar en nulo.
Pieter B
21
@Ryathal: nullen este caso no se usa como un valor especial, se usa como el significado correcto de null"falta". Entonces, si su campo es ExpiryDate, que es más correcto: null(lo que significa que no hay fecha de vencimiento) o END_OF_TIME(que no existe, hasta donde sabemos). Claramente nullo NoValuealgo similar es la mejor solución.
Scott Whitlock
3
@jwenting: no hacen distinción porque no hay una. NULL significa que no existe o, en términos más humanos, el valor simplemente no está definido.
Ramhound
17

Como industria, hemos sido notoriamente miopes y arbitrarios en la búsqueda de salvar algunos bytes, por ejemplo

  • 31 dic 99
  • 19 de enero de 2038
  • T + 50 años, cuando espero que todos los sistemas en los que he estado involucrado hayan desaparecido o hayan sido reemplazados (o estoy muerto, lo que ocurra primero).

En 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 marco DateTime.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:

Option<DateTime> LeaseExpiryDate(Home rental) 
{
    if (... expiry date can be determined ...)
       return Some(rental.ExpiryDate);
    else
       return None;
}

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í:

LeaseExpiryDate(myHome) match {
     case Some(expiryDate) => "Expired"
     case None => "No Expiry"
}
StuartLC
fuente
Duh Yo ciego No importa.
ott--
Algún día, tal vez. Tendremos un William Kahan para fechas y horarios. Tendremos cosas como marcas de tiempo infinitas positiva y negativamente, " NaT" valores, etc.
Ross Patterson
44
No se pudo evitar recordar esto: exit109.com/~ghealton/y2k/y2k_humor/Cobol.html
Julia Hayward
7

Probablemente quieras una algebraic data typevariante con infinita grande date. Luego defina la comparación, en la cual la infinitevariante siempre será más grande que cualquier otra date.

Ejemplo en Scala:

sealed abstract class SmartTime extends Ordered[SmartTime] { x =>
        def compare(y: SmartTime) = {
                x match {
                        case InfiniteFuture => 1
                        case InfinitePast => -1
                        case ConcreteTime(x) =>
                                y match {
                                        case InfiniteFuture => -1
                                        case InfinitePast => 1
                                        case ConcreteTime(y) => x compare y
                                }
                }
        }
}
case class ConcreteTime(t: Long) extends SmartTime
case object InfiniteFuture extends SmartTime
case object InfinitePast extends SmartTime

http://ideone.com/K5Kuk

Nombre para mostrar
fuente
Cita el código en tu respuesta para la posteridad.
mortal
2

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.

MSalters
fuente
1

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.

grahamparks
fuente
0

Generalmente no existe tal valor, porque no sería útil como una construcción de lenguaje.

MAX_INTy 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_DATEvalor 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.

TZHX
fuente
0

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. :)

Vladimir Stokic
fuente