Implementando un calendario no terrestre

91

Mientras buscaba soluciones para otra pregunta, me pregunté si era posible usar la Calendarclase .NET para implementar un calendario que no se basara en las convenciones terrestres.

Por ejemplo, el día de Marte es aproximadamente un 2,7% más largo que un día aquí en la Tierra:

Una convención utilizada por los proyectos de aterrizaje de naves espaciales hasta la fecha ha sido realizar un seguimiento de la hora solar local utilizando un "reloj de Marte" de 24 horas en el que las horas, minutos y segundos son un 2,7% más largos que su duración estándar (terrestre).

¿Hay alguna buena manera de poner en práctica una MarsCalendarforma que la longitud de un segundo es diferente de la norma GregorianCalendar, y por lo tanto será capaz de utilizar DateTimeobjetos basados en él durante toda la norma AddDays(), AddHours()etc. funciones? (Nota: Idealmente, una solución, si existe, sería aplicable a cualquier forma de objeto planetario para el que sea posible definir tanto "1 día" como "1 año" de longitudes consistentes. Marte es un gran ejemplo, aunque )

Bobson
fuente
5
hmmm esa sería la primera vez que veo marcianos dependientes de nuestra tecnología: P
user2711965
17
Debería haber una insignia para "Mejor pregunta del día", ¡y esta debería ganarla!
Sean
4
@DavidKhaykin: una vez que llega a algo más grande que un día, la conversión del 2.7% se rompe. Las horas / minutos / segundos se basan en la velocidad de rotación, mientras que los días / meses / años se basan en la velocidad de la órbita. Por otro lado, Calendarya admite establecer números arbitrarios de días por año.
Bobson
5
FYI, no es una Calendarclase C # . La misma clase puede ser utilizada por VB.NET o cualquier otro lenguaje .NET. Es la Calendarclase .NET .
John Saunders
4
Esto es un poco interesante. CUALQUIER calendario terrestre sería simplemente inútil en el contexto del seguimiento del tiempo en Marte. En el tiempo de la Tierra, Marte gira en 29 horas, 39 minutos, 35 segundos. Un año marciano son 1.8809 años terrestres. Pero si Marte es su marco de referencia, todo eso no tiene sentido. Tu día es el tiempo que le tome a Marte girar alrededor de su eje una vez. Divida eso en una cantidad conveniente de porciones, obtendrá "horas". Divide esos, obtienes minutos, divide esos y obtienes segundos. Las divisiones son matemáticamente útiles, sin significado más allá de lo que les atribuimos.
Craig

Respuestas:

13

Hay varias clases de calendario no gregoriano derivadas del System.Globalization.Calendarespacio de nombres de Globalización (es decir JapaneseCalendar). Debería poder implementar el suyo. Prepararía una muestra, pero hay 16 métodos abstractos en la clase Calendar ...

Incluso podría simplemente derivar su clase GregorianCalendary simplemente anular el GetMilliseconds(DateTime)método, devolviendo el valor de retorno de la base multiplicado por 1.027d.

Michael Hoffmann
fuente
2
Interesante. ¿Eso se propagaría a incrementos de tiempo más grandes, o tendría que anular cada uno por separado?
Bobson
2
Después de investigar un poco más sobre los otros calendarios, supongo que GregorianCalendar y los otros calendarios usan la propiedad Ticks de cada DateTime que se le pasa para las matemáticas detrás de todos sus métodos GetX. Se complica con los valores DateTime, porque las propiedades DayOfYear, DayOfMonth y DayOfWeek están sujetas a valores terrenales. No hay calendarios integrados en el espacio de nombres System.Globalization que tiene más de 12 meses o más de 365 días (aunque algunos tienen menos días), así que supongo que esos valores restringidos no se pueden anular, por lo que es posible que necesite su propia estructura DateTime.
Michael Hoffmann