2

我现在正在做一个项目,该项目需要我让用户能够在数据库中存储负日期。这些日期有可能跨越公元前数千年,甚至迟到“今天”。我参与过许多存储日期的项目,但它们都是相对较新的日期,而且没有一个是负数(BC)。

在处理此类数据时,我应该考虑哪些类型的事情?我完全了解历史上发生的许多日历转换,但我将使用现代日历,而不是太担心进行转换。但是,任何有关转换的信息都将不胜感激,因为它是一个非常相关的主题,也是我在学术上感兴趣的一个,尽管在这个项目中不需要关注。

更新:我将存储YYYY-MM-DD(不需要该格式)。

4

3 回答 3

2

您的存储需要多精确?是年、天还是小时/分钟。如果您只查看天或年,那么您可能不需要实际存储日期,而是从您的 0 日期开始的 +/- 天/年的偏移量

于 2009-07-14T01:56:05.673 回答
0

我遇到了类似的问题,我想继续在数据库中的日期字段上进行中继,以允许我使用日期范围搜索,准确度高达一天的历史值。(我的数据库包括出生日期和罗马皇帝的日期......)

解决方案是在将所有日期添加到数据库之前添加一个常量年份(例如:3000),并在向用户显示查询结果之前减去相同的数字。

如果您的数据库中已经有一些日期值,请记住使用新的 const 数字更新现有值。

于 2014-02-28T07:39:20.277 回答
0

这个答案应该涵盖所有书面/记录的人类历史

MySQL 可接受的日期范围是从 1000-01-01 到 9999-12-31。(来源:Dev.MySQL.com:11.2.2 DATE、DATETIME 和 TIMESTAMP 类型。)因此,事实上,问题不是从负日期或BCE日期开始,而是从 1000 年之前的所有日期开始,例如,图拉真的诞生,公元 53 年等。

所以,让我们劫持一些日期! 我们将把3000 年视为 1000 年。 我知道这是其他人建议的,但是代码和演示在哪里?这就是我要填写的内容。

当减去/添加年份来劫持日期范围时,我们需要处理一些奇怪的边缘情况。例如,公元前和公元(至公元 9999 年)都已损坏,但这两个日期范围的工作方式不同。什么样的逻辑可以对以下两个要求进行成功的重新映射?

  • 在 AD 中,我们说,“今年是 x,明年是 x + 1。”
  • 在 BC,我们说,“今年是 x,明年是 x - 1。”

无论如何,让我们编码!

从任何数据库值转换为日期

老子出生,正式的“公元前571年”,技术上,“公元-571年”。它存储为4571.

year = 4571;
if(year >= 3000) {
  diff = year - 3000;
  real_year_number = 1000 - diff;
  console.log(real_year_number);
}

从任何日期转换为数据库值

于是,“公元前571年”老子又一次诞生了。它被视为-571.

year = -571;

if(year < 1000) {
    diff = ((year - 1000) * (-1)) + 3000;
  console.log(diff);
}

附录——关于破折号

如果你在玩这些东西,你很快就会意识到许多日期格式库只需要两个破折号“年-月-日”等,而使用负数“-年-月-日”就可以了肆虐。就我个人而言,我已经重写了上面的内容,在 bce 日期前加上“BCE”,也就是说,你将拥有像“bce571-01-01”这样的值,而不是“-571-01-01”等。

于 2021-11-06T00:20:07.707 回答