$year = date('Y', strtotime("2012"));
var_dump($year);//returns 2013
这发生在使用 php 5.2 的旧服务器和带有 php 5.4 的新服务器上
服务器使用 strtotime 从字符串(如 2012-01-01
或 2012-01
或 2012
我也尝试使用$dt = new DateTime('2012')
然后getTimestamp
返回"1374516720",即"周一,22 Jul 2013 18:12:00 GMT">
是什么导致了此错误?在文档中,它说strtotime只接受年份
我不知道该怎么办。。。
编辑:
$year = date('Y', strtotime("2012"));
被视为军事时间,当年 20:12
使用完整的日期字符串YYYY-MM-DD
和01.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);