Menerapkan kalender non-terestrial

91

Saat saya mencari solusi untuk pertanyaan lain, saya mendapati diri saya bertanya-tanya apakah mungkin menggunakan Calendarkelas .NET untuk mengimplementasikan kalender yang tidak berdasarkan konvensi Bumi.

Misalnya, hari Mars sekitar 2,7% lebih lama dari satu hari di Bumi:

Sebuah konvensi yang digunakan oleh proyek pendarat pesawat ruang angkasa hingga saat ini adalah untuk melacak waktu matahari lokal menggunakan "jam Mars" 24 jam di mana jam, menit dan detik 2,7% lebih lama dari durasi standar (Bumi) mereka.

Apakah ada cara yang baik untuk mengimplementasikan MarsCalendarsehingga panjang dari kedua berbeda dari standar GregorianCalendar, dan dengan demikian dapat digunakan DateTimebenda berdasarkan itu untuk semua standar AddDays(), AddHours(), dll fungsi? (Catatan: Idealnya, sebuah solusi - jika ada - akan dapat diterapkan untuk segala bentuk objek planet yang memungkinkan untuk menentukan panjang yang konsisten "1 hari" dan "1 tahun". Mars adalah contoh yang bagus, meskipun )

Bobson
sumber
5
hmmm itu akan menjadi pertama kalinya saya melihat orang-orang Mars bergantung pada teknologi kami: P
user2711965
17
Harus ada lencana untuk "Pertanyaan terbaik hari ini", dan ini akan memenangkannya!
Sean
4
@DavidKhaykin - Setelah Anda mencapai sesuatu yang lebih dari sehari, 2,7% konversi rusak. Jam / menit / detik didasarkan pada kecepatan rotasi, sedangkan Hari / Bulan / Tahun didasarkan pada kecepatan orbit. Di sisi lain, Calendarsudah mendukung pengaturan jumlah hari sewenang-wenang per tahun.
Bobson
5
FYI, ini bukan Calendarkelas C # . Kelas yang sama dapat digunakan oleh VB.NET atau bahasa .NET lainnya. Ini adalah Calendarkelas .NET .
John Saunders
4
Ini menarik. Kalender berbasis bumi apa pun akan menjadi tidak berguna dalam konteks melacak waktu di Mars. Di waktu Bumi, Mars berputar dalam 29 jam, 39 menit, 35 detik. Satu tahun Mars adalah 1.8809 tahun Bumi. Tetapi jika Mars adalah kerangka acuan Anda, semua itu tidak ada artinya. Hari Anda hanya berapa lama yang dibutuhkan Mars untuk memutar porosnya satu kali. Bagilah menjadi beberapa bagian, Anda mendapatkan "jam". Bagi itu, Anda mendapatkan menit, bagi itu dan Anda mendapatkan detik. Pembagian hanya berguna secara matematis, tanpa makna di luar apa yang kami anggap berasal dari mereka.
Craig

Jawaban:

13

Ada beberapa kelas kalender non-Gregorian yang diturunkan dari System.Globalization.Calendardalam namespace Globalization (yaitu JapaneseCalendar). Anda harus bisa menerapkannya sendiri. Saya akan menyiapkan sampel, tetapi ada 16 metode abstrak di kelas Kalender ...

Anda bahkan mungkin bisa mendapatkan kelas Anda dari GregorianCalendardan hanya mengganti GetMilliseconds(DateTime)metode, mengembalikan nilai kembalian basis dikalikan dengan 1.027d.

Michael Hoffmann
sumber
2
Menarik. Apakah itu akan menyebar hingga peningkatan waktu yang lebih besar, atau apakah saya harus menggantinya secara terpisah?
Bobson
2
Setelah lebih banyak meneliti kalender lain, saya kira GregorianCalendar dan kalender lainnya menggunakan properti Kutu dari setiap DateTime yang diteruskan ke kalender tersebut untuk matematika di balik semua metode GetX-nya. Ini menjadi rumit dengan nilai DateTime, karena properti DayOfYear, DayOfMonth, dan DayOfWeek dijepit ke nilai duniawi. Tidak ada kalender yang terpasang di dalam System.Globalization namespace yang memiliki lebih dari 12 bulan atau lebih dari 365 hari (meskipun beberapa memiliki lebih sedikit hari), jadi saya rasa nilai-nilai yang dijepit itu tidak dapat diganti, jadi Anda mungkin perlu struktur DateTime Anda sendiri.
Michael Hoffmann