php日期组件不正常,关于php:strtotime日期不正确

我发现strtotime()有点奇怪。

在不存在的日期,它将返回第二天。

$d30= strtotime("2017-06-30");

Echo $d30 ."

";

Echo date("Y-m-d", $d30)."

";  // 2017-06-30

$d31= strtotime("2017-06-31");

Echo $d31 ."

";

Echo date("Y-m-d", $d31)."

";  // 2017-07-01

$d32= strtotime("2017-06-32");

Echo $d32 ."

";

Echo date("Y-m-d", $d32);         // 1970-01-01

https://3v4l.org/AjMAE

我了解最后一个。 它不返回任何内容,因为它是一个错误。

但是,为什么第二个在七月初返回?

如果您犯了一个错误,它会"纠正您"吗? 还是strtotime()中的真正错误?

6月一个月只有30天。 因此,如果您编写31 PHP日期函数,则会自动将其转换为下一个日期。

所以它意味着要起作用吗? 我在手册中找不到有关它的任何内容。

值31是strtotime可接受的值,不是32

为什么这样做呢? 因为这就是他们选择实施修补程序的方式。 如果您阅读php.net上的条目,则该函数非常宽松。 另请参阅他们如何处理" +1个月"的1月30日和31日

@DaveS不确定我是否找到您提到的正确的。 您可以链接到它吗? 海报名称是一个链接

在调用strtotime函数之后,使用checkdate()函数确定日期是否有效

我想到的评论是+1个月,类似的修正-php.net/manual/en/function.strtotime.php#111989

@DaveS谢谢,那是我当时读的那本书。

@HussyBorad感谢您的checkdata()! 我不知道那存在。

如果查看strtotime()的文档,您将看到第一个参数是:

time

A date/time string. Valid formats are explained in Date and Time Formats.

如果您点击日期和时间格式的链接,然后转到日期格式,您将看到:

455ce8be4cf1d76d9145d839da2f5ace.png

因此,对于日期格式(即DD),尽管有月份,但01-31是有效的(因为3只能跟0或1后跟)。根据提供的月份和日期值,日期将被调整。

也可以在同一页的注释中找到:

Note:

It is possible to over- and underflow the dd and DD format. Day 0 means the last day of previous month, whereas overflows count into the next month. This makes"2008-08-00" equivalent to"2008-07-31" and"2008-06-31" equivalent to"2008-07-01" (June only has 30 days).1

因此06-31有效,而06-32无效。

此外,在"用户贡献的笔记"部分中,Mirek在2015-04-01 01:14发表的笔记可能有用/有趣:

Note: the day (dd or DD) is first checked for range 0..31 and only if it fits, the overflow and underflow mechanism may apply. If not, strtotime() simply returns false.

If you need unlimited over/underflow for date calculations (for example 2015-01-40 to 2015-02-09), use mktime() instead.2

1 http://php.net/manual/en/datetime.formats.date.php sub>

2 http://php.net/manual/en/datetime.formats.date.php#Hcom117014 sub>

哈! 我从未点击有关有效日期的链接。 没想到那里有什么要读书的。 我希望主页上有足够的信息来解决它。 谢谢。

由于可能在一个月的第31天strtotime()为您更正日期。如果您在2月(2017-02-31)尝试使用,它将更正为2017-03-03。这就是您所发现的。

因此,它的本质作用是:

得到日期

检查日期是否在有效范围内(每天

月)

如果无效,请计算下个月的天数

此行为在strtotime函数本身中实现。

在文档页面上对此有很好的评论,但我不再能够找到它。该评论提供了一些额外的信息(一定要检查评论中的链接)。

谢谢! 奇怪的是,手册本身对此的信息很少。 您必须阅读有关" +1个月"的评论,然后才能找到它。

确实,@ SamOnela引用了引用(有关日期的文档)对其进行了解释。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值