4

我有一个数据库,其中有几个未知的月份或日期,格式如下:1999-01-00/ 1999-00-00

现在,我一直在使用DateTime()格式化已满的日子,效果很好。

我想有未知日期的缩写,但使用$DateTime->format('M Y');哪些输出已知月份Sep 1999

$DateTime->format('Y');因为1999那是未知的月份和日子。

DateTime()不允许00几个月/几天的值,那么有什么方法可以解决这个问题?

4

2 回答 2

4

正是我正在寻找的(并且不想听到)。

对于像我这样懒惰的人来说,这是一个基本的 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;
    }
}
于 2012-10-16T00:13:30.140 回答
2

不幸的是,DateTime 类几乎是 UNIX 时间戳的包装器。(我说了很多,我知道它不仅仅如此。)它与日期一起工作的方式是其中一个元素为零,只是将它计算为上一时期的同义词。(例如:4 月 0 日计算为 3 月 31 日。)

实际上,您只需要绕过 PHP 的内置日期功能并编写您自己的。好消息是你确实可以做到这一点。MySQL 实际上会以简单字符串的形式返回值,并且,当涉及到日期时,实际 C 库使用的自然响应是将日期几乎作为 ISO 8601 字符串返回。(这句话几乎又出现了。)

如果我正在写这个,我会用(或你自己的方法)读取原始值mysql_fetch_row并检查是否定义了所有元素(:年、月、日)。如果是,请使用 DateTime 方法。如果没有,我会编写一段代码来分解定义的元素并相应地格式化它。

于 2012-05-12T00:43:30.093 回答