Implementierung eines nicht-terrestrischen Kalenders

91

Als ich nach Lösungen für eine andere Frage suchte, fragte ich mich, ob es möglich war, mit der .NET- CalendarKlasse einen Kalender zu implementieren, der nicht auf irdischen Konventionen basierte.

Zum Beispiel ist der Tag des Mars etwa 2,7% länger als ein Tag hier auf der Erde:

Eine Konvention, die bisher von Landerprojekten für Raumfahrzeuge verwendet wurde, bestand darin, die lokale Sonnenzeit mit einer 24-Stunden- "Marsuhr" zu verfolgen, bei der die Stunden, Minuten und Sekunden 2,7% länger sind als ihre Standarddauer (Erde).

Gibt es eine gute Möglichkeit , einen zu implementieren , MarsCalendarso dass die Länge eines zweiten von der Norm abweicht GregorianCalendar, und somit in der Lage sein , um den Einsatz DateTimeauf ihnen Objekte basierend für alle Standards AddDays(), AddHours()etc. Funktionen? (Hinweis: Idealerweise wäre eine Lösung - falls vorhanden - auf jede Form von Planetenobjekt anwendbar, für die es möglich ist, sowohl "1 Tag" als auch "1 Jahr" mit gleichbleibenden Längen zu definieren. Der Mars ist jedoch ein gutes Beispiel )

Bobson
quelle
5
hmmm das wäre das erste mal, dass ich Marsmenschen sehe, die von unserer Technologie abhängig sind: P
user2711965
17
Es sollte ein Abzeichen für "Beste Frage des Tages" geben, und das sollte es gewinnen!
Sean
4
@DavidKhaykin - Sobald Sie mehr als einen Tag erreicht haben, bricht die 2,7% -Konvertierung zusammen. Stunden / Minuten / Sekunden basieren auf der Drehzahl, während Tage / Monate / Jahre auf der Umlaufgeschwindigkeit basieren. CalendarUnterstützt andererseits bereits das Festlegen beliebiger Tageszahlen pro Jahr.
Bobson
5
Zu Ihrer Information, es ist keine C # Calendar-Klasse. Dieselbe Klasse kann von VB.NET oder einer anderen .NET-Sprache verwendet werden. Es ist die .NET- CalendarKlasse.
John Saunders
4
Das ist irgendwie interessant. JEDER erdbasierte Kalender wäre im Zusammenhang mit der Zeiterfassung auf dem Mars einfach sinnlos. In der Erdzeit dreht sich der Mars in 29 Stunden, 39 Minuten und 35 Sekunden. Ein Marsjahr ist 1.8809 Erdjahre. Aber wenn der Mars Ihr Bezugsrahmen ist, ist das alles bedeutungslos. Ihr Tag ist genauso lang, bis sich der Mars einmal um seine Achse dreht. Teilen Sie das in eine bequeme Anzahl von Scheiben, Sie erhalten "Stunden". Teilen Sie diese, Sie erhalten Minuten, teilen Sie diese und Sie erhalten Sekunden. Die Unterteilungen sind nur mathematisch praktisch und haben keine Bedeutung, die über das hinausgeht, was wir ihnen zuschreiben.
Craig

Antworten:

13

Es gibt mehrere nicht-gregorianische Kalenderklassen, die aus System.Globalization.Calendardem Globalisierungs-Namespace (dh JapaneseCalendar) abgeleitet sind. Sie sollten in der Lage sein, Ihre eigenen zu implementieren. Ich würde ein Beispiel zusammenstellen, aber es gibt 16 abstrakte Methoden in der Kalenderklasse ...

Möglicherweise können Sie Ihre Klasse sogar einfach von GregorianCalendarder GetMilliseconds(DateTime)Methode ableiten und diese einfach überschreiben , indem Sie den Rückgabewert der Basis multipliziert mit zurückgeben 1.027d.

Michael Hoffmann
quelle
2
Interessant. Würde sich das in größeren Zeitschritten ausbreiten, oder müsste ich jedes einzeln überschreiben?
Bobson
2
Nach ein wenig mehr Recherche in den anderen Kalendern würde ich vermuten, dass GregorianCalendar und die anderen Kalender die Ticks-Eigenschaft jeder an sie übergebenen DateTime für die Mathematik hinter all ihren GetX-Methoden verwenden. Mit DateTime-Werten wird es kompliziert, da die Eigenschaften DayOfYear, DayOfMonth und DayOfWeek auf irdische Werte beschränkt sind. Im System.Globalization-Namespace sind keine Kalender integriert, die länger als 12 Monate oder länger als 365 Tage sind (obwohl einige weniger Tage haben). Ich vermute, dass diese geklemmten Werte nicht überschrieben werden können Ihre eigene DateTime-Struktur.
Michael Hoffmann