strtotime和DateTime在解析一年时给出错误的年份

时间:2013-07-22 10:40:12

标签: php strtotime

$year = date('Y', strtotime("2012"));
var_dump($year);//returns 2013

这是一个旧的服务器与PHP 5.2和一个新的PHP 5.4

服务器使用strtotime从2012-01-012012-012012

等字符串中获取年份

我也尝试使用$dt = new DateTime('2012'),然后getTimestamp返回“1374516720”,即“星期一,2013年7月22日18:12:00 GMT”

导致此错误的原因是什么?在documentation中,它表示strtotime只接受年份

我不知道该怎么做......

修改

$year = date('Y', strtotime("2012"));

被视为军事时间,当年20:12

3 个答案:

答案 0 :(得分:5)

使用完整的日期字符串YYYY-MM-DD01.01作为当天为我做了诀窍:

$year = date('Y', strtotime("2012-01-01"));
var_dump($year);//returns 2012

通常我会建议使用DateTime::createFromFormat()作为@Rufinus建议,但PHP5.2中没有该方法(您在其中一台服务器上使用的方法)。也许升级旧旧的原因? ;)


发生这种情况的原因:

虽然manual在某一点上说YYYY(并且只是YYYY)格式没问题,但它会告诉我们对以下某些行的限制:strtotime()调用{{1}在特殊情况下,将返回今天的时间戳,20:12:

  

“年(仅年)”格式仅在找到时间字符串时才有效 - 否则此格式被识别为HH MM。

我在说YYYY时不知道他们的意思。但是您可以使用以下行看到此行为:

a time string has already been found

这导致结果var_dump(date("Y-m-d H:i:s", strtotime('2012'))); // output: string(19) "2013-07-22 20:12:00"

答案 1 :(得分:3)

编辑:不同的格式......

$date = '2012-11';

$parts = explode('-', $date);
switch(count($parts)){
        case 2:
                $format = 'Y-m';
                break;
        case 3:
                $format = 'Y-m-d';
                break;
        case 1:
        default:
                $format = 'Y';
                break;
}

$date = DateTime::CreateFromFormat($format, $year);
echo $date->format('Y');

答案 2 :(得分:0)

尝试更多手动方法。我发现strtotime在边缘情况下不太可靠,并且更愿意控制正在发生的事情。

$parsed = explode('-',$input_string);
$year = (isset($parsed[0])) ? $parsed[0] : NULL;
$month = (isset($parsed[0])) ? $parsed[0] : 1;
$day = (isset($parsed[0])) ? $parsed[0] : 1;

$timestamp = mktime(0,0,0,$day,$month,$year);
echo date($your_preffered_format, $timestamp);