当输入格式为YYYY且值大于1999时,strtotime返回当前年份

时间:2012-02-23 21:11:38

标签: php strtotime

我不确定这是一个错误,因为在搜索之后我找不到任何重复的经历 - 但是,这个让我感到难过。

虽然在一个(相当痛苦的)脚本中打算采取一堆自由文本记录并将它们转换为有用的日期记录,但我可信赖的朋友strtotime()似乎让我失望。

出于测试目的,我将代码简化为:

<?=date('Y', strtotime("1999"));?>

输出显示:1999

<?=date('Y', strtotime("1981"));?>

输出显示:1981

<?=date('Y', strtotime("2001"));?>

输出显示:2012

<?=date('Y', strtotime("2021"));?>

输出显示:2012

在输入超过“1999”之前,一切似乎都很好 - 从那时起,每一年前后每年都会返回当前年份(2012年)

非常感谢任何输入。

5 个答案:

答案 0 :(得分:4)

根据PHP的date/time format文档:

  

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

(页面上的最后一个注释)。

答案 1 :(得分:1)

尝试使用Jan 1,作为年份的前缀。

例如:

<?=date('Y', strtotime("Jan 1, 2021"));?>按预期输出2021

我认为这是因为某些年份可能被错误地解析为月/日对,例如“2012”被解释为“当年12月20日”。

如果您需要自己提供证明,请尝试将日期格式更改为r
<?=date('r', strtotime('2001'));?>提供Thu, 23 Feb 2012 20:01:00

答案 2 :(得分:1)

问题是,它被解析为时间,如果您使用date('c')而不是date('Y');,则可以看到。

php > var_dump(date('c', strtotime("2001")));
string(25) "2012-02-23T20:01:00+01:00"

您应该明确传递值2012-01-01

另一个解决方案是使用一个函数,它允许指定给定输入的格式,如strptime()DateTime::createFromFormat()

php > echo DateTime::createFromFormat('Y', '2001')->format('c');
2001-02-23T22:29:56+01:00

答案 3 :(得分:0)

使用此:

echo date('Y', strtotime("1/1/2001"));
echo date('Y', strtotime("1/1/2021"));

使用4位数作为日期可以解释为时间,您应该使用更具体的格式来确保该功能按预期工作。 所以2021年是2012年的20:21(24小时格式)

答案 4 :(得分:0)

$plaintext = '2004'; //'2004-11','2004-5','2004-5-1','2004/5-1','2004/08/10'
echo date('Y', strtotime(     (strlen($plaintext)==10?$plaintext:         (strlen($plaintext)==7? str_replace('-','/',$plaintext).'/01':              (strlen($plaintext)==4?$plaintext.'/01/01':$plaintext)          )
)));