月と日の部分がオプションの日付を処理する必要があるという問題があります。たとえば、その年はいつも知られていますが、時には昼または月と日が分からないこともあります。データベース作業の中からMySQLの日付フィールドのオプションの月または日PHP
(YYYY-MM-DD format):
2011-02-10 // Current date
2011-02-00 // Day unknown so replaced with 00
2011-00-00 // Day and month unkown so replaced with 00-00
テストの計算:私は日付フィールドを持つテーブルを作成することができますし、私はMySQLのマニュアルの参照を見つけることができない一方で、それは有効なものとして、以下を受け入れるMySQLでは
結果を簡単に並べ替えることができます。マニュアルでは、その月は01から12、そして01から31の間の日付でなければならないと言いますが、00を受け取ります。
最初の質問:月または日の部品で00を使用して問題に遭遇しますか?それとも完璧に受け入れられますか?
次の質問:次の日付を必要な書式文字列に自動的に書式設定するPHP関数(またはMySQL書式コマンド)はありますか?
2011 becomes 2011-00-00
2011-02 becomes 2011-02-00
これを処理するには特殊な関数を記述する必要がありますか?
以下は動作しません:
<?php
$date = date_create_from_format('Y-m-d', '2011-00-00');
echo date_format($date, 'Y-m-d');
// Returns 2010-11-30
$date = date_create_from_format('Y-m-d', '2011-02-00');
echo date_format($date, 'Y-m-d');
// Returns 2011-01-31
?>
3番目の質問:PHPで使用するための日付をフォーマットするPHP関数(またはMySQLのコマンド)がありますか?
最後に、これが最善のアプローチですか?または、「ベストプラクティス」方法がありますか?
EDIT:
を日付フィールドには、フォーマットYYYYの日付を受け入れるYYYY-MM、またはYYYY-MM-DDと前にすることができます:ここで
は、私が現在やっているものですそれは、この関数内で処理されたデータベースへの送信:
/**
* Takes a date string in the form:
* YYYY or
* YYYY-MM or
* YYYY-MM-DD
* and validates it
*
* Use date_format($date, $format); to reverse.
*
* @param string $phpDate Date format [YYYY | YYYY-MM | YYYY-MM-DD]
*
* @return array 'date' as YYYY-MM-DD, 'format' as ['Y' | 'Y-m' | 'Y-m-d'] or returns false if invalid
*/
function date_php2mysql($phpDate) {
$dateArr = false;
// Pattern match
if (preg_match('%^(?P<year>\d{4})[- _/.]?(?P<month>\d{0,2})[- _/.]?(?P<day>\d{0,2})%im', trim($phpDate), $parts)) {
if (empty($parts['month'])) {
// Only year valid
$date = $parts['year']."-01-01";
$format = "Y";
} elseif (empty($parts['day'])) {
// Year and month valid
$date = $parts['year']."-".$parts['month']."-01";
$format = "Y-m";
} else {
// Year month and day valid
$date = $parts['year']."-".$parts['month']."-".$parts['day'];
$format = "Y-m-d";
}
// Double check that it is a valid date
if (strtotime($date)) {
// Valid date and format
$dateArr = array('date' => $date, 'format' => $format);
}
} else {
// Didn't match
// Maybe it is still a valid date
if (($timestamp = strtotime($phpDate)) !== false) {
$dateArr = array('date' => date('Y-m-d', $timestamp), 'format' => "Y-m-d");
}
}
// Return result
return $dateArr;
}
は、だから、パターンは、それが4桁、月と日の数字の後、必要に応じてペアで開始する必要があります入力の$ phpDateにマッチします。これらは$ partsという配列に格納されます。
次に、フォーマット文字列を指定して日付を作成しているかどうかを確認します。
最終的にすべてがチェックアウトされた場合、有効な日付とフォーマット文字列が返されます。それ以外の場合はFALSEを返します。
私のデータベースの有効な日付形式になってしまい、戻ってくるときにもう一度使用する方法があります。
誰かがこれを行うより良い方法を考えていますか?
サンプルにはどのような結果が期待されますか? – zerkms
MySQLのサンプルは、00かどうかに関係なく、YYYY-MM-DDの形式で動作します。 PHPの例ではコメントの結果が返されますが、最初の2011-00-00と2番目の2011-02-00の形式にしたいと思っていました。 – Das123