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

发布于 2025-01-08 20:20:50 字数 575 浏览 0 评论 0原文

我不确定这是一个错误,因为搜索后我找不到任何重复的经历 - 然而,这个让我难住了。

虽然在一个(相当痛苦的)脚本中,该脚本旨在获取一堆自由文本记录并将它们转换为有用的日期记录,但我值得信赖的朋友 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

无边思念无边月 2025-01-15 20:20:50

根据 PHP 的 日期/时间格式 文档:

“年份(仅年份)”格式仅在已找到时间字符串的情况下才有效,否则此格式将被识别为 HH MM。

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

As per PHP's date/time format docs:

The "Year (and just the year)" format only works if a time string has already been found -- otherwise this format is recognised as HH MM.

(2nd last note on the page).

耳根太软 2025-01-15 20:20:50

问题是,它被解析为时间,如果您使用 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

The problem is, that it is parsed as time, what you can see if you use date('c') instead of date('Y');.

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

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()

php > echo DateTime::createFromFormat('Y', '2001')->format('c');
2001-02-23T22:29:56+01:00
不再让梦枯萎 2025-01-15 20:20:50

尝试在年份前面加上 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"));?> outputs 2021 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'));?> gives Thu, 23 Feb 2012 20:01:00

一绘本一梦想 2025-01-15 20:20:50

使用这个:

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

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

Use this:

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

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

霓裳挽歌倾城醉 2025-01-15 20:20:50

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文