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


strtotime and DateTime giving wrong year when parsing a year

$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",即"周一,22 Jul 2013 18:12:00 GMT">

是什么导致了此错误?在文档中,它说strtotime只接受年份

我不知道该怎么办。。。

编辑:

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

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

使用完整的日期字符串YYYY-MM-DD01.01作为一天为我做了技巧:

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

通常我建议按照@Rufinus的建议使用DateTime::createFromFormat(),但该方法在 PHP5.2 中不可用(您在其中一台服务器上使用的方法(。也许是升级旧版本的原因?;)


发生这种情况的原因:

虽然手册一度说YYYY(并且只是 YYYY(格式是可以的,但它在下面的几行中讲述了对该行为的限制: strtotime() YYYY调用,在特殊情况下将返回今天的时间戳,20:12:

"年份(和年份("格式仅在已找到时间字符串时才有效 - 否则此格式被识别为 HH MM。

我不知道他们在说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"

这会导致结果2013 .

编辑:不同的格式...

尝试

$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');

尝试更多的手动方法。 我发现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);
相关文章: