实施非地球日历
Posted
技术标签:
【中文标题】实施非地球日历【英文标题】:Implementing a non-terrestrial calendar 【发布时间】:2014-03-23 07:11:49 【问题描述】:当我正在寻找另一个问题的解决方案时,我发现自己想知道是否可以使用 .NET 的 Calendar
类来实现不基于地球约定的日历。
例如,Mars' day 比地球上的一天长约 2.7%:
迄今为止,航天器着陆器项目使用的惯例是使用 24 小时“火星时钟”跟踪当地太阳时,其时、分和秒比其标准(地球)持续时间长 2.7%。
有没有什么好的方法来实现MarsCalendar
,使得一秒的长度不同于标准的GregorianCalendar
,从而能够在所有标准AddDays()
中使用基于它的DateTime
对象、AddHours()
等功能? (注意:理想情况下,一个解决方案——如果存在的话——将适用于任何形式的行星物体,它可以定义“1天”和“1年”的一致长度。火星非常适合例如)
【问题讨论】:
嗯,这将是我第一次看到 martians 依赖于我们的技术:P 应该有一个“今日最佳问题”的徽章,这应该会赢! @DavidKhaykin - 一旦你完成超过一天的任务,2.7% 的转化率就会下降。小时/分钟/秒基于旋转速度,而天/月/年基于轨道速度。另一方面,Calendar
已经支持设置每年的任意天数。
仅供参考,它不是 C# Calendar
类。 VB.NET 或任何其他 .NET 语言都可以使用相同的类。这是 .NET Calendar
类。
这很有趣。在跟踪火星时间的情况下,任何基于地球的日历都是毫无意义的。在地球时间,火星自转 29 小时 39 分 35 秒。一个火星年是 1.8809 个地球年。但如果火星是你的参照系,那么所有这些都是毫无意义的。你的一天只是火星绕其轴旋转一次所需的时间。把它分成方便数量的切片,你得到“小时”。除以这些,你得到分钟,除以那些,你得到秒。这些划分只是在数学上很方便,除了我们赋予它们的意义之外没有任何意义。
【参考方案1】:
在 Globalization 命名空间(即 JapaneseCalendar
)中有几个派生自 System.Globalization.Calendar
的非公历类。您应该能够实现自己的。我会制作一个示例,但 Calendar 类中有 16 个抽象方法...
您甚至可以简单地从 GregorianCalendar
派生您的类,然后重写 GetMilliseconds(DateTime)
方法,返回基的返回值乘以 1.027d
。
【讨论】:
有趣。这会传播到更大的时间增量,还是我必须分别覆盖每个增量? 在对其他日历进行了更多研究之后,我猜想 GregorianCalendar 和其他日历使用传递给它的每个 DateTime 的 Ticks 属性来进行其所有 GetX 方法背后的数学运算。 DateTime 值变得复杂,因为 DayOfYear、DayOfMonth 和 DayOfWeek 属性被限制为实际值。 System.Globalization 命名空间中没有内置日历,其 more 超过 12 个月或超过 365 天(尽管有些天数更少),所以我猜这些限定值不能被覆盖,因此您可能需要自己的 DateTime 结构。以上是关于实施非地球日历的主要内容,如果未能解决你的问题,请参考以下文章
「NCS 10000,非一般的分布式存储」: 超高并发 • 助力新疆地球物理研究所“用数据找油”!