在PHP中,如果给定一个扩展的日期字符串,如何以长格式提取月份和年份?

在PHP中,如果给定一个扩展的日期字符串,如何以长格式提取月份和年份?,php,datetime,strtotime,Php,Datetime,Strtotime,我尝试的解决方案是: $date = "Nov 30 2009 03:00:00:000PM"; echo date("F Y", strtotime($date)); 预期结果应为:“2009年11月” 还有其他简单的解决方案吗?虽然正则表达式可以做到这一点,但这里有一些您可能更容易理解的东西 $date_bad = "Nov 30 2009 03:00:00:000PM"; $piece_date = array(); $piece_date = explode(' ', $date_b

我尝试的解决方案是:

$date = "Nov 30 2009 03:00:00:000PM";
echo date("F Y", strtotime($date));
预期结果应为:“2009年11月”


还有其他简单的解决方案吗?

虽然正则表达式可以做到这一点,但这里有一些您可能更容易理解的东西

$date_bad = "Nov 30 2009 03:00:00:000PM";

$piece_date = array();
$piece_date = explode(' ', $date_bad);
$date_good = $piece_date[0] .' '. $piece_date[1] .', '. $piece_date[2] .' ';

$piece_time = array();
$piece_time = explode(':', $piece_date[3]);

// check if the last part contains PM
if ( is_numeric(strpos($piece_time[3], 'PM')) )
{
    $ampm = 'PM';
}
// check if the last part contains AM
elseif ( is_numeric(strpos($piece_time[3], 'AM')) )
{
    $ampm = 'AM';
}
// no AM or PM is there, so it's a 24hr string
else
{
    $ampm = ''; 
}

$date_good .= $piece_time[0] .':'. $piece_time[1] .':'. $piece_time[2] . $ampm;

echo date("F", strtotime($date_good));

03:00:00:000PM
毫无意义。如果您将该字符串的源代码更正为
03:00:00
,我认为
strotime()
会起作用。那么问题是什么,因为结果是11月?!?!我无法控制返回的datetime的来源:(无法在我的本地框上测试,因为“警告:strotime():依赖系统的时区设置是不安全的。您需要使用date.timezone设置或date\u default\u timezone\u set()函数。我的错误尽管有errorwell,但它似乎仍然有效。如果这对您不起作用(在5.3.x上对我是这样),那么您必须实现“垃圾输入,垃圾输出”,因此您需要解析/清理输入。可能使用regex,然后将其发送到strotime()。即使按空间分割,也只需修复时间,时间可以用冒号分割。再简单不过了!问题的示例已经使用了strottime(),但它不起作用。
date_default_timezone_set  ('Etc/GMT-6');
$unixtime = strtotime($date_bad);
$date = date("F Y",$unixtime);
echo $date;