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 タイムスタンプのラッパーです。(私はかなり言いましたが、それだけではありません。)日付が要素の1つである場合に機能する方法は、単純に前の期間の同義語として計算することです。(: 4 月 0 日は 3 月 31 日と計算されます。)

実際には、PHP に組み込まれている日付機能をバイパスして、独自の日付機能を作成する必要があります。良いニュースは、実際にこれを行うことができるということです。MySQL は実際には単純な文字列として値を返します。日付に関しては、実際の C ライブラリが使用する自然な応答は、ほとんど ISO 8601 文字列として日付を返すことです。(そのフレーズはほとんど再びあります。)

私がこれを書いていたら、値を raw でmysql_fetch_row(または独自の方法で) 読み取り、すべての要素 (つまり、年、月、日) が定義されているかどうかを確認します。そうである場合は、DateTime メソッドを使用します。そうでない場合は、コードを記述して、定義されている要素を分離し、それに応じてフォーマットします。

于 2012-05-12T00:43:30.093 に答える