我的数据库有几个未知的月份或日期,格式如下:1999-01-00
/ 1999-00-00
。
现在,我一直在使用DateTime()
格式化已满的日子,效果很好。
我希望在未知日期使用缩写,但使用$DateTime->format('M Y');
知道月份的缩写,输出Sep 1999
和
$DateTime->format('Y');
表示1999
未知的月份和日期。
DateTime()
几个月/几天不允许00
个值,那么有什么方法可以解决这个问题呢?
答案 0 :(得分:3)
正是我所寻找的(并且不想听)。
这是一个基本的php函数,适合那些像我一样懒惰的人。
function formatDatabaseDate($date, $delimiter = '/')
{
// this function works only on mysql date fields,
// and takes into account partial dates.
if ($date != '' && $date != NULL)
{
$datePieces = explode('-', $date);
if (count($datePieces) == 3 &&
strlen($datePieces[0]) == 4 &&
strlen($datePieces[1]) == 2 &&
strlen($datePieces[2]) == 2)
{
$datestring = '';
$months['01'] = 'Jan';
$months['02'] = 'Feb';
$months['03'] = 'Mar';
$months['04'] = 'Apr';
$months['05'] = 'May';
$months['06'] = 'Jun';
$months['07'] = 'Jul';
$months['08'] = 'Aug';
$months['09'] = 'Sep';
$months['10'] = 'Oct';
$months['11'] = 'Nov';
$months['12'] = 'Dec';
if ($datePieces[2] != '00' && $datePieces[1] != '00')
{
$datestring = $datePieces[2] . $delimiter
. $months[$datePieces[1]] . $delimiter
. $datePieces[0];
}
else if ($datePieces[1] != '00')
{
$datestring = $months[$datePieces[1]] . $delimiter
. $datePieces[0];
}
else
{
$datestring = $datePieces[0];
}
return $datestring;
}
else
{
trigger_error('date is not in a valid mysql format');
return false;
}
}
else
{
trigger_error('empty date passed to format command');
return false;
}
}
答案 1 :(得分:2)
不幸的是,DateTime类几乎是UNIX时间戳的包装器。 (我说几乎,我知道它不仅仅是那个。)它与日期一起工作的方式之一就是零是简单地将它计算为前一个时期的同义词。 (例如:4月0日计算为3月31日。)
真的,你只需要绕过PHP的内置日期功能并自己编写。好消息是你确实可以做到这一点。 MySQL实际上将值作为简单字符串返回,并且,当涉及到日期时,实际C库使用的自然响应是将日期作为ISO 8601字符串返回。 (那里的短语几乎。)
如果我写这篇文章,我会用mysql_fetch_row
(或你自己的方法)读取原始值并检查所有元素(即:年,月,日)是否为定义。如果是,请使用DateTime方法。如果没有,我会写一段代码来拆分定义的元素并相应地格式化它。