Implementazione di un calendario non terrestre


91

Mentre cercavo soluzioni per un'altra domanda, mi sono ritrovato a chiedermi se fosse possibile utilizzare la Calendarclasse .NET per implementare un calendario che non fosse basato sulle convenzioni terrene.

Ad esempio, il giorno di Marte è circa il 2,7% più lungo di un giorno qui sulla Terra:

Una convenzione utilizzata dai progetti dei lander dei veicoli spaziali fino ad oggi è stata quella di tenere traccia dell'ora solare locale utilizzando un "orologio di Marte" di 24 ore su cui le ore, i minuti ei secondi sono il 2,7% più lunghi della loro durata standard (Terra).

C'è un buon modo per implementare un MarsCalendartale che la lunghezza di un secondo è diversa da quella standard GregorianCalendar, e quindi essere in grado di utilizzare DateTimeoggetti basati su di esso per tutti gli standard AddDays(), AddHours()ecc funzioni? (Nota: idealmente, una soluzione, se esiste, sarebbe applicabile a qualsiasi forma di oggetto planetario per il quale è possibile definire sia "1 giorno" che "1 anno" di lunghezze costanti. Marte rappresenta un ottimo esempio, tuttavia )


5
hmmm questa sarebbe la prima volta che vedo i marziani dipendenti dalla nostra tecnologia: P
user2711965

17
Dovrebbe esserci un badge per "Migliore domanda del giorno", e questo dovrebbe vincere!
Sean

4
@DavidKhaykin - Quando arrivi a qualcosa di più grande di un giorno, la conversione del 2,7% si interrompe. Le ore / minuti / secondi si basano sulla velocità di rotazione, mentre i giorni / mesi / anni si basano sulla velocità dell'orbita. D'altra parte, Calendarsupporta già l'impostazione di numeri arbitrari di giorni all'anno.
Bobson

5
Cordiali saluti, non è una Calendarclasse C # . La stessa classe può essere utilizzata da VB.NET o da qualsiasi altro linguaggio .NET. È la Calendarclasse .NET .
John Saunders

4
Questo è piuttosto interessante. QUALSIASI calendario basato sulla Terra sarebbe semplicemente inutile nel contesto del monitoraggio del tempo su Marte. In tempo terrestre, Marte ruota in 29 ore, 39 minuti e 35 secondi. Un anno marziano è 1.8809 anni terrestri. Ma se Marte è il tuo quadro di riferimento, tutto ciò non ha senso. La tua giornata è solo il tempo che impiega Marte a ruotare attorno al suo asse una volta. Dividilo in un numero conveniente di fette, ottieni "ore". Dividi quelli, ottieni minuti, dividi quelli e ottieni secondi. Le divisioni sono solo matematicamente utili, senza alcun significato al di là di ciò che le attribuiamo.
Craig

Risposte:


13

Esistono diverse classi di calendario non gregoriano derivate dallo System.Globalization.Calendarspazio dei nomi Globalization (ovvero JapaneseCalendar). Dovresti essere in grado di implementare il tuo. Vorrei creare un campione, ma ci sono 16 metodi astratti nella classe Calendar ...

Potresti anche essere in grado di derivare semplicemente la tua classe GregorianCalendare sovrascrivere il GetMilliseconds(DateTime)metodo, restituendo il valore di ritorno della base moltiplicato per 1.027d.


2
Interessante. Ciò si propagherebbe fino a incrementi di tempo maggiori o dovrei sovrascriverli separatamente?
Bobson

2
Dopo un po 'più di ricerca sugli altri calendari, immagino che GregorianCalendar e gli altri calendari utilizzino la proprietà Ticks di ogni DateTime passata per la matematica dietro tutti i suoi metodi GetX. Diventa complicato con i valori DateTime, perché le proprietà DayOfYear, DayOfMonth e DayOfWeek sono fissate ai valori terrestri. Non ci sono calendari integrati nello spazio dei nomi System.Globalization che hanno più di 12 mesi o più di 365 giorni (anche se alcuni hanno meno giorni), quindi immagino che quei valori bloccati non possano essere sovrascritti, quindi potrebbe essere necessario la tua struttura DateTime.
Michael Hoffmann
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.