PHP-处理基督前后的日期



我在我的网站上制作生物图谱,其中列出了已知的历史人物。

现在,我只是从数据库中获取值,并在许多IF语句中确定要显示的内容。

 /* @var $bio ModelsLibraryBiography */
 $birth = [];
 $death = [];
 $date = null;
 if($bio->getBirthMonth() != null) {
    if ($bio->getBirthDay() != null) {
       $birth = [
           $bio->getBirthDay(),
           $bio->getBirthMonth(),
           $bio->getBirthYear(),
       ];
    } else {
       $birth = [
           $bio->getBirthMonth(),
           $bio->getBirthYear(),
       ];
    }
 } else {
    $birth = [
        $bio->getBirthYear(),
    ];
 }
 if($bio->getDeathMonth() != null) {
    if ($bio->getDeathDay() != null) {
       $death = [
           $bio->getDeathDay(),
           $bio->getDeathMonth(),
           $bio->getDeathYear(),
       ];
    } else {
       $death = [
           $bio->getDeathMonth(),
           $bio->getDeathYear(),
       ];
    }
} else {
    $death = [
       $bio->getDeathYear(),
    ];
}
if (!array_filter($birth) && array_filter($death)) {
    $date = 'zm. ' . implode('.', $death);
}
if (array_filter($birth) && !array_filter($death)) {
    $date = 'ur. ' . implode('.', $birth);
}
if (!array_filter($birth) && !array_filter($death)) {
    $date = null;
}
if (array_filter($birth) && array_filter($death)) {
    $date = implode('.', $birth) . ' - ' . implode('.', $death);
}

但首先,我对这种代码不满意(不知道我是否能写得更好)。

其次,当我使用Carbon(例如),并想显示中世纪的年份时,它看起来像0552,而不是552。

最后一件事是,历史上没有"0年"。基督之后有一年,基督之前有一年。所以当我想要200年的时候,它给了我199年。

我知道如果是BC,可以通过在日期上加-1来处理,但我认为这不是正确的方式。

有没有DateTime的php库可以很好地处理所有日期?

我也可以,如果可以的话;如何重写上面的代码以使其看起来更好?

干杯:)

这是一个非常有趣的问题。

首先,您的if语句-我将在$bio中编写一个助手函数,该函数包含关于显示日期的逻辑,并引用$bio中存在的其他属性。你可以称之为getPrettyDate()或类似的东西。这可能也是你正确显示年份的逻辑所在。

经过大量的谷歌搜索和运气不佳,这个答案似乎对这个问题最有帮助,当然也值得思考。

同样值得注意的是,在将这些信息持久化到数据库时使用DATE(假设您使用的是MySQL,而您可能不是MySQL)可能不是在您的情况下的前进方向-正如在该答案中所指出的,MySQL对DATE的定义如下

日期

约会。支持的范围为"1000-01-01"到"9999-12-31"。

在写下这篇文章后,我也偶然发现了这个答案,这可能是最好的方法。祝你好运

在"0年"的背景下阅读更多关于ISO-8601的内容。

相关内容

  • 没有找到相关文章

最新更新