我有日期作为格式的文本字符串 -
16 October 2012
08 October 2012
04 October 2012
我想将它们转换为 MySQL 'date' 友好的格式。
我有以下实现 -
$fixed = date("Y-m-d", strtotime($date));
它将所有日期返回为 -
1969-12-31
strtotime
有一个可接受的格式列表,您使用的不是其中之一。
$d = strptime($date, '%d %B %Y');
$fixed = date("Y-m-d", mktime(0,0,0,$d['tm_mon'],$d['tm_mday'],$d['tm_year']));
除了我的其他答案(我使用 PHP 日期函数来获取结果)之外,如果您想避免它们并针对您的特定情况使用更快的方法,您可以使用以下自定义函数:
function mysql_date($d) {
$m = array('jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec');
$ex = explode(' ',$d);
$mon = array_search( strtolower( substr($ex[1],0,3) ) ,$m) + 1;
return $ex[2] . '-' . $mon . '-' . $ex[0];
}
$date='16 October 2012';
echo mysql_date($date); //echoes '2012-10-16'
这应该适用于 PHP 5.3 及更高版本:
$date='16 October 2012';
$a = date_parse_from_format($date, '%d %F %Y');
$atime = mktime(0, 0, 0, $a['month'], $a['day'], $a['year']);
echo date("Y-m-d", $atime);
如果您有较旧的 PHP 版本,请注意您的 PHP 不在 Windows 上,因为没有在 Windows 中strptime()
实现,推荐的方法是date_parse_from_format()
按照我上面的建议使用,请参阅从strptime()页面提取的警告:
注意:此功能在 Windows 平台上未实现。
注意:在内部,该函数调用系统 C 库提供的 strptime() 函数。此函数可以在不同的操作系统中表现出明显不同的行为。建议在 PHP 5.3.0 及更高版本上使用不受这些问题影响的 date_parse_from_format()。
因此,如果您的 PHP 版本早于 5.3 并且不能在 Windows 上运行,那么您可以使用以下代码:
$date='16 October 2012';
$a = strptime($date, '%d %B %Y');
$atime = mktime(0, 0, 0, $a['tm_mon'], $a['tm_mday'], $a['tm_year']);
echo date("Y-m-d", $atime);
为此使用 PHP 的DateTime
类——它使事情变得更容易......
function sqlDateFromLongDate($input) {
$dateObj = DateTime::createFromFormat($input,'d F Y');
return $dateObj->format('Y-m-d');
}
print sqlDateFromLongDate('08 October 2012');
希望有帮助。
**注意:此解决方案需要 PHP 5.3 及更高版本。(但还要注意,这是现在支持的最低版本:如果您使用的是较低版本,请注意 php 5.2 在近两年前就停止了支持——是时候升级了)