这个答案应该涵盖所有书面/记录的人类历史
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”等。