我在我的网站上制作生物图谱,其中列出了已知的历史人物。
现在,我只是从数据库中获取值,并在许多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的内容。