Wdrażanie nieziemskiego kalendarza

91

Kiedy szukałem rozwiązań na inne pytanie, zacząłem się zastanawiać, czy można użyć Calendarklasy .NET do zaimplementowania kalendarza, który nie byłby oparty na ziemskich konwencjach.

Na przykład dzień Marsa jest o 2,7% dłuższy niż dzień tutaj na Ziemi:

Konwencja stosowana do tej pory w projektach lądowników statków kosmicznych polegała na śledzeniu lokalnego czasu słonecznego za pomocą 24-godzinnego „zegara marsjańskiego”, w którym godziny, minuty i sekundy są o 2,7% dłuższe niż ich standardowe (ziemskie) czasy trwania.

Czy istnieje dobry sposób zaimplementować MarsCalendartak, że długość sekundy różni się od standardu GregorianCalendar, a tym samym mieć możliwość korzystania z DateTimeobiektów na niej oparta na wszystkich standardowych AddDays(), AddHours()itd funkcji? (Uwaga: Idealnie byłoby, gdyby rozwiązanie - jeśli takie istnieje - miałoby zastosowanie do dowolnej formy obiektu planetarnego, dla którego możliwe jest zdefiniowanie zarówno „1 dnia”, jak i „1 roku” o stałej długości. Mars jest jednak świetnym przykładem )

Bobson
źródło
5
hmmm to byłby pierwszy raz, kiedy widzę Marsjan zależnych od naszej technologii: P
user2711965,
17
Powinna istnieć odznaka „Najlepsze pytanie dnia”, a ta powinna wygrać!
Sean,
4
@DavidKhaykin - Gdy osiągniesz cokolwiek większego niż jeden dzień, konwersja 2,7% spada. Godziny / minuty / sekundy są oparte na prędkości obrotowej, a dni / miesiące / lata na prędkości orbity. Z drugiej strony Calendarobsługuje już ustawianie dowolnej liczby dni w roku.
Bobson,
5
FYI, to nie jest Calendarklasa C # . Ta sama klasa może być używana przez VB.NET lub dowolny inny język .NET. To Calendarklasa .NET .
John Saunders
4
To trochę interesujące. DOWOLNY kalendarz ziemski byłby po prostu bezcelowy w kontekście śledzenia czasu na Marsie. W czasie ziemskim Mars obraca się w 29 godzin, 39 minut, 35 sekund. Rok marsjański to 1,8809 ziemskiego roku. Ale jeśli Mars jest twoim układem odniesienia, wszystko to jest bez znaczenia. Twój dzień zajmie tyle czasu, ile zajmie Marsowi jednorazowy obrót wokół własnej osi. Podziel to na dogodną liczbę kawałków, a otrzymasz „godziny”. Dziel je, dostajesz minuty, dziel je i dostajesz sekundy. Podziały są po prostu matematycznie przydatne, bez znaczenia poza tym, co im przypisujemy.
Craig,

Odpowiedzi:

13

Istnieje kilka klas kalendarza innych niż gregoriański wywodzących się z System.Globalization.Calendarprzestrzeni nazw Globalization (tj JapaneseCalendar.). Powinieneś być w stanie wdrożyć własne. Przygotowałbym próbkę, ale w klasie Calendar jest 16 abstrakcyjnych metod ...

Możesz nawet po prostu wyprowadzić swoją klasę z metody GregorianCalendari po prostu zastąpić GetMilliseconds(DateTime)metodę, zwracając wartość zwracaną przez podstawę pomnożoną przez 1.027d.

Michael Hoffmann
źródło
2
Ciekawy. Czy rozprzestrzeniłoby się to na większe przyrosty czasu, czy też musiałbym nadpisać każdy z nich osobno?
Bobson
2
Po nieco dokładniejszym zbadaniu innych kalendarzy, przypuszczam, że GregorianCalendar i inne kalendarze używają właściwości Ticks każdego przekazanego do niego DateTime w celu obliczenia matematycznego wszystkich metod GetX. Sytuacja komplikuje się w przypadku wartości DateTime, ponieważ właściwości DayOfYear, DayOfMonth i DayOfWeek są ograniczone do wartości ziemskich. Nie ma wbudowanych kalendarzy w przestrzeni nazw System.Globalization, które mają więcej niż 12 miesięcy lub więcej niż 365 dni (chociaż niektóre mają mniej dni), więc domyślam się, że tych wartości zablokowanych nie można zastąpić, więc może być konieczne własną strukturę DateTime.
Michael Hoffmann