Впровадження неземного календаря


91

Розглядаючи рішення для іншого питання, я здивувався, чи можна використовувати Calendarклас .NET для реалізації календаря, який не базувався на земних конвенціях.

Наприклад, день Марса приблизно на 2,7% довший, ніж день тут на Землі:

Конвенція, що використовувалась на сьогоднішній день проектами посадки космічних кораблів, полягала в тому, щоб відстежувати місцевий сонячний час за допомогою 24-годинного "Марсового годинника", коли години, хвилини та секунди на 2,7% перевищують їх стандартну тривалість (Земля).

Чи є хороший спосіб реалізувати MarsCalendarтаким чином, що довжина другого відрізняється від стандарту GregorianCalendar, і , таким чином , мати можливість використовувати DateTimeоб'єкти на його основі для всіх стандарт AddDays(), AddHours()і т.д. функції? (Примітка: В ідеалі рішення - якщо воно існує - було б застосовним до будь-якої форми планетарного об'єкта, для якого можна визначити як "1 день", так і "1 рік" однакової довжини. Хоча Марс є чудовим прикладом, хоча )


5
хммм, це було б вперше, коли я бачу, що марсіани залежать від нашої технології: P
user2711965

17
Має бути значок "Найкраще питання дня", і це має його виграти!
Шон

4
@DavidKhaykin - Як тільки ви досягнете чогось більшого, ніж день, конверсія на 2,7% руйнується. Години / хвилини / секунди засновані на швидкості обертання, тоді як дні / місяці / роки - на основі швидкості обертання. З іншого боку, Calendarвже підтримується встановлення довільної кількості днів на рік.
Бобсон

5
FYI, це не Calendarклас C # . Цей же клас може використовувати VB.NET або будь-яка інша мова .NET. Це Calendarклас .NET .
Джон Сондерс,

4
Це якось цікаво. БУДЬ-який земний календар був би просто безглуздим у контексті відстеження часу на Марсі. У земний час Марс обертається за 29 годин 39 хвилин 35 секунд. Марсіанський рік - 1,8809 земних років. Але якщо Марс - це ваша система відліку, все це безглуздо. Скільки часу потрібно, щоб Марс один раз обертався навколо своєї осі. Поділивши це на зручну кількість скибочок, ви отримаєте "години". Поділіть ці, ви отримаєте хвилини, поділите ті, і ви отримаєте секунди. Ці розділи просто математично зручні, без значення, ніж те, що ми їм приписуємо.
Крейг

Відповіді:


13

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

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


2
Цікаво. Чи буде це поширюватися до більших кроків у часі, чи мені доведеться замінювати кожен окремо?
Бобсон

2
Після ще кількох досліджень інших календарів, я здогадуюсь, що GregorianCalendar та інші календарі використовують властивість Ticks кожного DateTime, переданого йому для математики за всіма його методами GetX. Це ускладнюється значеннями DateTime, оскільки властивості DayOfYear, DayOfMonth та DayOfWeek притискаються до земних значень. У систему немає вбудованих календарів. Простір імен Globalization, який має більше 12 місяців або більше 365 днів (хоча деякі мають менше днів), тому я гадаю, ці зафіксовані значення не можна замінити, тому вам може знадобитися власну структуру DateTime.
Michael Hoffmann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.