我在我的网站上制作传记,上面列出了已知的历史人物。
现在,我只是从数据库中获取值,在许多IF语句上,确定要显示什么。
/* @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库可以很好地处理所有的日期?
我也可以,如果可以的话,如何重写上面的代码,使之看起来更好看?
干杯:)
发布于 2015-06-26 10:21:36
这是一个非常有趣的问题。
首先,您的if语句--我将在$bio中编写一个助手函数,其中包含关于作为日期显示什么的逻辑,并引用$bio中存在的其他属性。你可以叫它getPrettyDate()之类的。这也可能是你让年份正确显示的逻辑所在。
经过大量搜索和运气不佳之后,这个答案似乎在这个问题上是最有帮助的,当然也是一些值得思考的东西。
还值得注意的是,在将这些信息持久化到数据库时使用DATE (假设您使用的是MySQL,您可能不会使用)在您的情况下可能不是前进的方向--正如该答案中所指出的,日期的MySQL定义如下
日期 一次约会。支持范围为“1000-01-01”到“9999-12-31”。
在写完这篇文章之后,我还偶然发现了这个答案,这可能是最好的方法。祝好运!
更多关于ISO-8601在“00年”这里上下文中的阅读。
https://stackoverflow.com/questions/31069210
复制相似问题