当输入格式为 YYYY 且值大于 1999 时,strtotime 返回当前年份
我不确定这是一个错误,因为搜索后我找不到任何重复的经历 - 然而,这个让我难住了。
虽然在一个(相当痛苦的)脚本中,该脚本旨在获取一堆自由文本记录并将它们转换为有用的日期记录,但我值得信赖的朋友 strtotime() 似乎让我失望了。
出于测试目的,我将代码归结为:
<?=date('Y', strtotime("1999"));?>
输出显示:1999
<?=date('Y', strtotime("1981"));?>
输出显示:1981
<?=date('Y', strtotime("2001"));?>
输出显示:2012
<?=date('Y', strtotime("2021"));?>
输出显示:2012
一切看起来都很好,直到输入超过“1999” - 从那时起,每年之前和之后当前返回当前年份(2012)
任何输入都非常感谢。
I'm not sure that this is a bug since after searching I can't find any duplicate experiences- however, this one has me stumped.
While in the midst of a (rather painful) script that is intended to take a bunch of freetext records and convert them to useful date records, my trusty friend strtotime() seems to have let me down.
For testing purposes, I boiled the code down to this:
<?=date('Y', strtotime("1999"));?>
Output shows: 1999
<?=date('Y', strtotime("1981"));?>
Output shows: 1981
<?=date('Y', strtotime("2001"));?>
Output shows: 2012
<?=date('Y', strtotime("2021"));?>
Output shows: 2012
Everything seems fine until the input exceeds "1999"- From that point on, every year before and after the current one returns the current year (2012)
Any input is much appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
根据 PHP 的 日期/时间格式 文档:
(页面上的第二个最后注释)。
As per PHP's date/time format docs:
(2nd last note on the page).
问题是,它被解析为时间,如果您使用
date('c')
而不是date('Y');
,您会看到什么。您应该传递明确的值,例如
2012-01-01
。另一种解决方案是使用一个函数,该函数允许指定给定输入的格式,例如 strptime() ,或DateTime::createFromFormat()
The problem is, that it is parsed as time, what you can see if you use
date('c')
instead ofdate('Y');
.You should pass the value unambiguous for example
2012-01-01
.Another solution is to use a function, that allows to specify the format of the given input, like strptime(), or DateTime::createFromFormat()
尝试在年份前面加上
Jan 1,
。例如:
按预期输出
2021
。我认为这是因为某些年份可能会被错误地解析为月/日对,例如“2012”被解释为“当年的 12 月 20 日”。
如果您想自己证明,请尝试将日期格式更改为
r
:给出
Thu, 23 Feb 2012 20:01:00
Try prefixing the years with
Jan 1,
.For example:
<?=date('Y', strtotime("Jan 1, 2021"));?>
outputs2021
as expected.I'm supposing this is because certain years can be incorrectly parsed as month/day pairs, such as "2012" being interpreted as "December 20th of the current year".
If you want proof for yourself, try changing the date format to
r
:<?=date('r', strtotime('2001'));?>
givesThu, 23 Feb 2012 20:01:00
使用这个:
使用 4 位数字作为日期可以解释为时间,您应该使用更具体的格式来确保该函数按您的预期工作。
所以 2021 年是 2012 年的 20:21(24 小时格式)
Use this:
Using 4 digits as date can be interpreted as time, you should use a more specific format to make sure the function works as you expect it.
So 2021 is 20:21 (24h format) of 2012
$plaintext = '2004'; //'2004-11','2004-5','2004-5-1','2004/5-1','2004/08/10'
回显日期('Y', strtotime(
(strlen($plaintext)==10?$plaintext:
(strlen($plaintext)==7? str_replace('-','/',$plaintext).'/01':
(strlen($plaintext)==4?$plaintext.'/01/01':$plaintext)
<代码>)
<代码>)));
$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)
)
)));