实施非地球日历

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,非一般的分布式存储」: 超高并发 • 助力新疆地球物理研究所“用数据找油”!

利用WPF建立自己的3d gis软件(非axhost方式)拖动一个UI到地球上

在火星旅行中,人体如何抵御200倍于地球的辐射?

地球自转速度

Cesium隐藏地球

cesium 卫星扫过哪里显示地球上的图片一部分