非地球カレンダーの実装


91

別の質問の解決策を検討しているときに、.NETのCalendarクラスを使用して、Earthlyの規則に基づいていないカレンダーを実装することが可能かどうか疑問に思いました。

たとえば、火星の日は、地球上の1日よりも約2.7%長くなります。

これまでの宇宙船着陸プロジェクトで使用されている規則は、24時間の「火星時計」を使用して現地の太陽時間を追跡することでした。時間、分、秒は標準の(地球)時間よりも2.7%長くなっています。

実装するために何か良い方法があるMarsCalendar第二の長さが標準と異なっていることなどはGregorianCalendar、したがって、使用することができるDateTimeすべての標準のためにそれに基づいてオブジェクトAddDays()AddHours()などの機能? (注:理想的には、解決策-存在する場合-は、一貫した長さの「1日」と「1年」の両方を定義できるすべての形式の惑星オブジェクトに適用できます。火星は良い例ですが、 )


5
私が私たちの技術に依存している武士を見るのは初めてだと思います:P
user2711965

17
「今日のベストクエスチョン」のバッジが必要です。これで当選するはずです。
Sean

4
@DavidKhaykin-1日を超えると、2.7%の変換が失敗します。時間/分/秒は回転速度に基づいており、日/月/年は軌道速度に基づいています。一方、Calendar1年あたりの任意の日数の設定は既にサポートされています。
ボブソン2014

5
参考までに、これはC#Calendarクラスではありません。同じクラスをVB.NETまたはその他の.NET言語で使用できます。これは.NET Calendarクラスです。
John Saunders、

4
これはちょっと面白いです。地球ベースのカレンダーは、火星の時間を追跡するという意味では無意味です。地球時間では、火星は29時間39分35秒で回転します。火星の年は1.8809地球年です。しかし、火星があなたの参照フレームである場合、そのすべては無意味です。火星がその軸を中心に1回回転するのにかかる時間は、どれだけ長くなります。それを適当な数のスライスに分割すると、「時間」が得られます。それらを分割すると、数分になり、それらを分割すると、数秒になります。除算は数学的に便利なだけであり、私たちが除算するものを超える意味はありません。
Craig

回答:


13

System.Globalization.Calendarグローバリゼーション名前空間(つまりJapaneseCalendar)内から派生したいくつかの非グレゴリオ暦のクラスがあります。自分で実装できるはずです。サンプルを作成しますが、Calendarクラスには16の抽象メソッドがあります...

単にクラスを派生させGregorianCalendarGetMilliseconds(DateTime)メソッドをオーバーライドするだけで、ベースの戻り値にを乗算し1.027dた値を返すこともできます。


2
面白い。それはより大きな時間増分まで伝播しますか、それとも個別にオーバーライドする必要がありますか?
ボブソン2014

2
他のカレンダーについてもう少し調査した後、GregorianCalendarと他のカレンダーは、渡された各DateTimeのTicksプロパティを、そのすべてのGetXメソッドの背後にある計算に使用していると思います。DayOfYear、DayOfMonth、DayOfWeekプロパティは実際の値に固定されるため、DateTime値は複雑になります。持っている内蔵のSystem.Globalization名前空間へのカレンダーはありませんより多くの私はあなたが必要な場合がありますので、これらのクランプ値は、オーバーライドすることはできません推測しているのでより12ヶ月以上より365日は、(いくつかはあまり日を持っているが)独自のDateTime構造。
Michael Hoffmann、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.