Mettre en œuvre un calendrier non terrestre

91

Alors que je cherchais des solutions pour une autre question, je me suis demandé s'il était possible d'utiliser la Calendarclasse de .NET pour implémenter un calendrier qui n'était pas basé sur les conventions terrestres.

Par exemple, la journée de Mars est environ 2,7% plus longue qu'une journée ici sur Terre:

Une convention utilisée par les projets d'atterrissage d'engins spatiaux à ce jour a été de garder une trace de l'heure solaire locale en utilisant une "horloge de Mars" de 24 heures sur laquelle les heures, minutes et secondes sont 2,7% plus longues que leurs durées standard (Terre).

Est - il un bon moyen de mettre en œuvre une MarsCalendartelle que la longueur d'une seconde est différente de la norme GregorianCalendar, et donc être en mesure d'utiliser les DateTimeobjets en fonction pour tous les standards AddDays(), AddHours()etc. fonctions? (Note: Idéalement, une solution - s'il en existe une - serait applicable à toute forme d'objet planétaire pour laquelle il est possible de définir à la fois "1 jour" et "1 an" de longueurs cohérentes. Mars est un excellent exemple, bien que )

Bobson
la source
5
hmmm ce serait la première fois que je vois des martiens dépendants de notre technologie: P
user2711965
17
Il devrait y avoir un badge pour "Meilleure question du jour", et cela devrait le gagner!
Sean
4
@DavidKhaykin - Une fois que vous obtenez quelque chose de plus grand qu'un jour, la conversion de 2,7% tombe en panne. Les heures / minutes / secondes sont basées sur la vitesse de rotation, tandis que les jours / mois / années sont basés sur la vitesse de l'orbite. D'autre part, Calendarprend déjà en charge la définition de nombres arbitraires de jours par an.
Bobson
5
FYI, ce n'est pas une Calendarclasse C # . La même classe peut être utilisée par VB.NET ou tout autre langage .NET. C'est la Calendarclasse .NET .
John Saunders
4
C'est en quelque sorte intéressant. TOUT calendrier terrestre serait simplement inutile dans le contexte du suivi du temps sur Mars. Dans le temps de la Terre, Mars tourne en 29 heures, 39 minutes, 35 secondes. Une année martienne correspond à 1,8809 années terrestres. Mais si Mars est votre cadre de référence, tout cela n'a aucun sens. Votre journée est juste aussi longue qu'il faut à Mars pour tourner autour de son axe une fois. Divisez cela en un nombre convenable de tranches, vous obtenez des «heures». Divisez-les, vous obtenez des minutes, divisez-les et vous obtenez des secondes. Les divisions sont simplement mathématiquement pratiques, sans signification au-delà de ce que nous leur attribuons.
Craig

Réponses:

13

Il existe plusieurs classes de calendrier non grégorien dérivées de System.Globalization.Calendarl'espace de noms Globalization (ie JapaneseCalendar). Vous devriez pouvoir mettre en œuvre le vôtre. Je préparerais un échantillon, mais il y a 16 méthodes abstraites dans la classe Calendar ...

Vous pourriez même être en mesure de dériver simplement votre classe GregorianCalendaret de simplement remplacer la GetMilliseconds(DateTime)méthode, en retournant la valeur de retour de la base multipliée par 1.027d.

Michael Hoffmann
la source
2
Intéressant. Est-ce que cela se propagerait à des incréments de temps plus importants ou devrais-je remplacer chacun séparément?
Bobson
2
Après un peu plus de recherche sur les autres calendriers, je suppose que GregorianCalendar et les autres calendriers utilisent la propriété Ticks de chaque DateTime qui lui est transmise pour les calculs derrière toutes ses méthodes GetX. Cela se complique avec les valeurs DateTime, car les propriétés DayOfYear, DayOfMonth et DayOfWeek sont limitées à des valeurs terrestres. Il n'y a pas de calendriers intégrés à l'espace de noms System.Globalization qui ont plus de 12 mois ou plus de 365 jours (bien que certains aient moins de jours), donc je suppose que ces valeurs serrées ne peuvent pas être remplacées, vous pourriez donc avoir besoin votre propre structure DateTime.
Michael Hoffmann