首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -处理基督前后的日期

PHP -处理基督前后的日期
EN

Stack Overflow用户
提问于 2015-06-26 09:10:03
回答 1查看 1.1K关注 0票数 2

我在我的网站上制作传记,上面列出了已知的历史人物。

现在,我只是从数据库中获取值,在许多IF语句上,确定要显示什么。

代码语言:javascript
复制
 /* @var $bio \Models\Library\Biography */
 $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);
}

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

其次,当im使用碳(例如),并且希望显示从中期开始的年份时,它看起来像是0552而不是552。

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

我知道如果是BC的话,可以通过添加-1来处理这个问题,但我认为这不是正确的方法。

是否有任何DateTime的php库可以很好地处理所有的日期?

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

干杯:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-26 10:21:36

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

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

经过大量搜索和运气不佳之后,这个答案似乎在这个问题上是最有帮助的,当然也是一些值得思考的东西。

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

日期 一次约会。支持范围为“1000-01-01”到“9999-12-31”。

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

更多关于ISO-8601在“00年”这里上下文中的阅读。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31069210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档