实施非地球日历


91

当我在寻找另一个问题的解决方案时,我发现自己想知道是否可以使用.NET的Calendar类来实现不基于地球惯例的日历。

例如,火星的一天比地球上的一天长约2.7%:

迄今为止,航天器着陆器项目使用的惯例是使用24小时“火星钟”跟踪当地的太阳时间,其时,分和秒比标准(地球)持续时间长2.7%。

有没有什么好的办法来实现MarsCalendar,使得第二的长度是不同的标准GregorianCalendar,从而能够使用DateTime对象基于它的所有标准AddDays()AddHours()等等的功能呢? (注意:理想情况下,一种解决方案-如果存在的话-适用于可以定义长度一致的“ 1天”和“ 1年”的任何形式的行星物体。 )


5
嗯,这将是我第一次看到火星人依赖我们的技术:P
user2711965 2014年

17
应该有一个“当日最佳问题”的徽章,这应该赢得它!
肖恩2014年

4
@DavidKhaykin-一旦您完成一天以上的任务,2.7%的转化率就会下降。时/分/秒是基于转速,而天/月/年是基于轨道速度。另一方面,Calendar已经支持设置每年的任意天数。
Bobson,2014年

5
仅供参考,它不是C#Calendar类。VB.NET或任何其他.NET语言都可以使用同一类。这是.NET Calendar类。
约翰·桑德斯

4
这很有趣。在火星上追踪时间的情况下,任何基于地球的日历都将毫无意义。在地球时间,火星以29小时39分35秒旋转。火星年为1.8809地球年。但是,如果火星是您的参照系,那么所有这些都是没有意义的。您的一天多么漫长,火星绕其轴旋​​转一次。将其划分为方便的数量,您将获得“小时”。除以得到分钟,除以得到秒。这些划分在数学上很方便,除我们赋予它们的含义外没有其他意义。
Craig

Answers:


13

System.Globalization.Calendar全球化命名空间(即JapaneseCalendar)中派生了几种非格里高利历类。您应该能够实现自己的。我会整理一个示例,但是Calendar类中有16个抽象方法...

您甚至可以简单地从中派生您的类GregorianCalendar并覆盖该GetMilliseconds(DateTime)方法,返回基数的返回值乘以1.027d


2
有趣。会传播到更大的时间增量,还是我必须分别覆盖每个变量?
Bobson,2014年

2
在对其他日历进行了更多研究之后,我猜想GregorianCalendar和其他日历将传递给它的每个DateTime的Ticks属性用于其所有GetX方法背后的数学运算。由于DayOfYear,DayOfMonth和DayOfWeek属性被限制为实际值,因此它与DateTime值变得复杂。有没有内置在System.Globalization命名空间日历有更多的超过12个月或超过365天(虽然一些有更少的天数),所以我猜这些钳位值不能被覆盖,所以你可能需要您自己的DateTime结构。
Michael Hoffmann 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.