Kiedy szukałem rozwiązań na inne pytanie, zacząłem się zastanawiać, czy można użyć Calendar
klasy .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ć MarsCalendar
tak, że długość sekundy różni się od standardu GregorianCalendar
, a tym samym mieć możliwość korzystania z DateTime
obiektó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 )
Calendar
obsługuje już ustawianie dowolnej liczby dni w roku.Calendar
klasa C # . Ta sama klasa może być używana przez VB.NET lub dowolny inny język .NET. ToCalendar
klasa .NET .Odpowiedzi:
Istnieje kilka klas kalendarza innych niż gregoriański wywodzących się z
System.Globalization.Calendar
przestrzeni nazw Globalization (tjJapaneseCalendar
.). 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
GregorianCalendar
i po prostu zastąpićGetMilliseconds(DateTime)
metodę, zwracając wartość zwracaną przez podstawę pomnożoną przez1.027d
.źródło