การใช้ปฏิทินที่ไม่ใช่ภาคพื้นดิน


91

ขณะที่ฉันกำลังหาวิธีแก้ปัญหาสำหรับคำถามอื่นฉันพบว่าตัวเองสงสัยว่าเป็นไปได้หรือไม่ที่จะใช้Calendarชั้นเรียนของ. NET เพื่อใช้ปฏิทินที่ไม่ได้อิงตามอนุสัญญาของโลก

ตัวอย่างเช่นวันของดาวอังคารยาวกว่าวันบนโลกประมาณ 2.7%:

การประชุมที่ใช้ในโครงการยานอวกาศแลนเดอร์จนถึงปัจจุบันคือการติดตามเวลาสุริยะในท้องถิ่นโดยใช้ "นาฬิกาดาวอังคาร" 24 ชั่วโมงซึ่งชั่วโมงนาทีและวินาทียาวกว่าระยะเวลามาตรฐาน (โลก) 2.7%

มีผู้ใดวิธีที่ดีในการดำเนินการMarsCalendarดังกล่าวว่าความยาวของสองจะแตกต่างจากมาตรฐานGregorianCalendarและทำให้สามารถใช้DateTimeวัตถุบนพื้นฐานของมันสำหรับทุกมาตรฐานAddDays(), AddHours()ฯลฯ ฟังก์ชั่น? (หมายเหตุ: ตามหลักการแล้ววิธีแก้ปัญหา - ถ้ามีอยู่ - จะใช้ได้กับวัตถุดาวเคราะห์ทุกรูปแบบซึ่งเป็นไปได้ที่จะกำหนดทั้ง "1 วัน" และ "1 ปี" ของความยาวที่สอดคล้องกันทั้งนี้ดาวอังคารเป็นตัวอย่างที่ดีแม้ว่า )


5
อืมนั่นคงเป็นครั้งแรกที่ฉันเห็นดาวอังคารขึ้นอยู่กับเทคโนโลยีของเรา: P
user2711965

17
ควรมีป้ายสำหรับ "คำถามที่ดีที่สุดของวัน" และสิ่งนี้ควรชนะ!
Sean

4
@DavidKhaykin - เมื่อคุณทำอะไรก็ได้มากกว่าหนึ่งวัน Conversion 2.7% จะแบ่งออก ชั่วโมง / นาที / วินาทีขึ้นอยู่กับความเร็วในการหมุนในขณะที่วัน / เดือน / ปีขึ้นอยู่กับความเร็ววงโคจร ในทางกลับกันCalendarรองรับการตั้งค่าจำนวนวันต่อปีโดยพลการอยู่แล้ว
Bobson

5
FYI ไม่ใช่CalendarคลาสC # คลาสเดียวกันสามารถใช้ได้โดย VB.NET หรือภาษา. NET อื่น ๆ มันคือCalendarคลาส. NET
John Saunders

4
นี่เป็นสิ่งที่น่าสนใจ ปฏิทินบนโลกใด ๆ ก็จะไม่มีจุดหมายในบริบทของการติดตามเวลาบนดาวอังคาร ตามเวลาโลกดาวอังคารหมุนใน 29 ชม. 39 นาที 35 วินาที ปีของดาวอังคารเท่ากับ 1.8809 ปีโลก แต่ถ้าดาวอังคารเป็นกรอบอ้างอิงของคุณทั้งหมดนั้นก็ไม่มีความหมาย วันของคุณใช้เวลานานแค่ไหนกว่าที่ดาวอังคารจะหมุนรอบแกนของมันหนึ่งครั้ง แบ่งเป็นจำนวนชิ้นตามสะดวกคุณจะได้ "ชั่วโมง" หารพวกนั้นคุณจะได้นาทีหารพวกนั้นแล้วคุณจะได้วินาที การหารมีประโยชน์ในทางคณิตศาสตร์โดยไม่มีความหมายเกินกว่าที่เรากำหนดไว้
Craig

คำตอบ:


13

มีคลาสปฏิทินที่ไม่ใช่เกรกอเรียนหลายคลาสที่ได้มาจากSystem.Globalization.Calendarภายในเนมสเปซโลกาภิวัตน์ (เช่นJapaneseCalendar) คุณควรจะสามารถใช้งานของคุณเองได้ ฉันจะสร้างตัวอย่าง แต่มีวิธีนามธรรม 16 วิธีในคลาสปฏิทิน ...

คุณยังอาจจะสามารถที่จะได้รับมาเพียงชั้นเรียนของคุณจากGregorianCalendarและเพียงแค่แทนที่วิธีการกลับค่าตอบแทนของฐานคูณด้วยGetMilliseconds(DateTime)1.027d


2
น่าสนใจ. สิ่งนี้จะแพร่กระจายไปตามเวลาที่มากขึ้นหรือฉันจะต้องลบล้างแต่ละรายการแยกกัน?
Bobson

2
หลังจากค้นคว้าเพิ่มเติมเกี่ยวกับปฏิทินอื่น ๆ แล้วฉันเดาว่า GregorianCalendar และปฏิทินอื่น ๆ ใช้คุณสมบัติ Ticks ของ DateTime แต่ละรายการที่ส่งผ่านไปยังคณิตศาสตร์ที่อยู่เบื้องหลังวิธี GetX ทั้งหมด มีความซับซ้อนกับค่า DateTime เนื่องจากคุณสมบัติ DayOfYear, DayOfMonth และ DayOfWeek ถูกยึดกับค่าทางโลก มีปฏิทินที่ไม่มีในตัว namespace System.Globalization ที่มีอยู่มากขึ้นกว่า 12 เดือนหรือมากกว่า 365 วัน (แม้ว่าบางคนมีวันน้อยกว่า) ดังนั้นคุณอาจต้องดังนั้นฉันเดาค่า clamped ผู้ที่ไม่สามารถแทนที่, โครงสร้าง DateTime ของคุณเอง
Michael Hoffmann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.