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

9

我需要一种方法来序列化和反序列化那些可能追溯到过去的日期,比如-10000

首先我看了ISO8601,但它似乎不支持超过四位数的年份。(或者至少,我尝试过的Python库不支持。)

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

  • 在序列化/反序列化之前更改年份,将其提供给解析/格式化库,然后再修复回去(听起来像是hacky的做法)
  • 定义自己的格式,例如year:month:day:hour:minute:second(这是重新发明轮子,因为我还要处理时区等问题)
  • 使用一个没有边界限制的UNIX时间戳或类似的东西(在某些编程语言中可能会溢出,而且仍旧有时区问题)
  • -9999(或0)之前存储日期与之后不同,因为那时还没有时区问题/闰年问题/...问题。(同一位置有两种不同的格式)

您是否知道其他更好的方法?或推荐其中的一种?


1
这个关于DBA的问题可能会有用:http://dba.stackexchange.com/questions/7077/best-way-to-handle-dates-prior-to-1000-a-d-in-mysql - naththedeveloper
“我尝试过的Python库都不行。” - 请告诉我们您尝试了什么以及结果如何。 - Robᵩ
3个回答

1

ISO 8601 支持带有超过 4 位数字 的日期,但仅当它们被标记时。我所知道支持此功能的唯一 PHP 函数是

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

显然,这很麻烦,因为它需要计算偏移量来与完美的日/月组合匹配。话虽如此,你可以通过在年份前加上“-”(减号)来创建公元前的日期。
然后,你可以使用以下代码输出日期:
DateTime::format("c")

在生产中,它看起来会像这样:

$date= new DateTime();

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

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

1
你可以借鉴天文学家的方法。他们会制作星图,考虑地球自转的长周期进动,并确定纪元。(如果你现在看天空和1万年前看天空是不同的。)
创建一个新类,该类具有“纪元”号和当前日期类的外观模式。新类包含两个私有字段:纪元和内部日期。您的构造函数将纪元设置为(年份除以10000),并使用(年份取模10000)实例化内部日期。我希望外观模式的其余部分就像我想的那样显而易见。

0

看一下FlexiDate类 - 它可能对您有用。

这并不是标准兼容的方式,但它可能对你有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接