$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”,即“星期一,2013年7月22日18:12:00 GMT”
导致此错误的原因是什么?在documentation中,它表示strtotime只接受年份
我不知道该怎么做......
修改
$year = date('Y', strtotime("2012"));
被视为军事时间,当年20:12
答案 0 :(得分:5)
使用完整的日期字符串YYYY-MM-DD
和01.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);