Реализация неземного календаря

91

Пока я искал решения для другого вопроса, мне стало интересно, можно ли использовать Calendarкласс .NET для реализации календаря, не основанного на земных соглашениях.

Например, день Марса примерно на 2,7% длиннее, чем день здесь, на Земле:

На сегодняшний день в проектах посадочных модулей космических кораблей используется соглашение об отслеживании местного солнечного времени с использованием 24-часовых «марсианских часов», на которых часы, минуты и секунды на 2,7% длиннее их стандартной (земной) продолжительности.

Есть ли хороший способ реализовать MarsCalendarтаким образом, что длина второго отличается от стандарта GregorianCalendar, и , таким образом , иметь возможность использовать DateTimeобъекты на его основе для всех стандарт AddDays(), AddHours()и т.д. функции? (Примечание: в идеале решение - если оно существует - было бы применимо к любой форме планетарного объекта, для которого можно определить как «1 день», так и «1 год» постоянной длины. Тем не менее, Марс является отличным примером )

Бобсон
источник
5
хммм, впервые я вижу марсиан, зависящих от наших технологий: P
user2711965
17
Должен быть значок «Лучший вопрос дня», и он должен его выиграть!
Шон
4
@DavidKhaykin - Как только вы доходите до чего-то большего, чем день, конверсия в 2,7% падает. Часы / минуты / секунды основаны на скорости вращения, а дни / месяцы / годы основаны на орбитальной скорости. С другой стороны, Calendarуже поддерживается установка произвольного числа дней в году.
Bobson
5
К вашему сведению, это не Calendarкласс C # . Этот же класс может использоваться VB.NET или любым другим языком .NET. Это Calendarкласс .NET .
Джон Сондерс
4
Это довольно интересно. ЛЮБОЙ земной календарь был бы просто бесполезен в контексте отслеживания времени на Марсе. По земному времени Марс вращается за 29 часов 39 минут 35 секунд. Марсианский год равен 1,8809 земных лет. Но если Марс является вашей системой отсчета, все это бессмысленно. Ваш день длится ровно столько, сколько нужно Марсу, чтобы один раз повернуться вокруг своей оси. Разделите это на удобное количество кусочков, и вы получите «часы». Разделите их, вы получите минуты, разделите их, и вы получите секунды. Деления просто математически удобны и не имеют никакого значения, кроме того, что мы им приписываем.
Craig

Ответы:

13

Существует несколько классов, не относящихся к григорианскому календарю, производных от System.Globalization.Calendarпространства имен Globalization (т.е. JapaneseCalendar). Вы должны иметь возможность реализовать свои собственные. Я бы взял образец, но в классе Calendar есть 16 абстрактных методов ...

Возможно, вы даже сможете просто унаследовать свой класс от метода GregorianCalendarи просто переопределить GetMilliseconds(DateTime)метод, возвращая возвращаемое базовое значение, умноженное на 1.027d.

Майкл Хоффманн
источник
2
Интересно. Будет ли это распространяться на более крупные временные интервалы, или мне придется переопределять каждый из них отдельно?
Bobson
2
После небольшого исследования других календарей, я бы предположил, что GregorianCalendar и другие календари используют свойство Ticks каждого DateTime, переданного ему, для математических расчетов всех его методов GetX. Это усложняется со значениями DateTime, потому что свойства DayOfYear, DayOfMonth и DayOfWeek привязаны к земным значениям. В пространство имен System.Globalization не встроены календари, которые имеют более 12 месяцев или более 365 дней (хотя у некоторых дней меньше), поэтому я предполагаю, что эти фиксированные значения нельзя переопределить, поэтому вам может потребоваться ваша собственная структура DateTime.
Michael Hoffmann