存储超过4位数年份的日期

时间:2014-11-10 08:38:58

标签: javascript php python date datetime

我需要一种方法来序列化和反序列化过去可能很远的日期,例如-10000

我首先看一下ISO8601,但它似乎不支持超过四位数的年份。 (至少,我试过的python库不是。)

我能想到的不同解决方案:

  • 更改序列化/反序列化之前的年份,将其提供给解析/格式化库,并将其修复(听起来很糟糕)
  • 定义我自己的格式,例如year:month:day:hour:minute:second(重新发明轮子,因为我必须处理时区等)。
  • 使用没有边界或等效的UNIX时间戳(在某些编程语言中可能会溢出,仍然是时区的东西)
  • -9999(或0)之前的日期与之后的日期不同,因为当时没有时区问题/闰年/ ...问题。 (两个不同的格式在同一个地方)

您是否看到了比这些方式更好的其他方式?或者推荐其中一个?

3 个答案:

答案 0 :(得分:1)

你可以从天文学家那里拿一页。天空地图通过建立时代来解释地球自旋的长期进动。 (如果你现在正在寻找公元前10,000年,天空会有所不同。)

创建一个新类,其中包含“epoch”编号和当前日期类的外观模式。新类包含epoch和internal-date的两个私有字段。您的构造函数将epoch设置为(year div 10000),并使用(year modulo 10000)实例化internal-date。我希望其余的立面图案和我想的一样明显。

答案 1 :(得分:1)

ISO 8601确实支持超过4 digits的日期,当且仅当它们已签名时。我所知道的唯一支持此功能的PHP函数是

DateTime::setISODate($Year, $WeekOffset, $DayofWeekOffset)

显然使用它很痛苦,因为它需要从完美的日/月对计算偏移量。也就是说,您应该能够通过使用' - '(减号)签署年份来创建BC日期。

然后你用

输出日期
DateTime::format("c")

在制作中,这看起来像是:

$date= new DateTime();

$date->setISODate(-100000,$WeekOffset, $DoWOs);

echo $date->format("c");

答案 2 :(得分:0)

查看FlexiDate课程 - 它可能对您有用。

它不是一种符合标准的方式,但它可能会为你做到这一点