gpt4 book ai didi

php - 为什么这个日期功能只能在 2016 年 12 月 30 日之前使用?

转载 作者:可可西里 更新时间:2023-10-31 22:09:35 25 4
gpt4 key购买 nike

我有这段代码:

for ($i=1; $i<=12; $i++) {

$monthNum = $i;
$monthName = date('F', mktime(0, 0, 0, $monthNum, 10));

$date_established = strtotime($monthName);
$date_established = strtotime('first day of this month', $date_established);
$date_established = date('Y-m-d', $date_established);
$date_established_end = date("Y-m-t", strtotime($date_established));

echo $i .'::'. $monthName . '::' . $date_established . '::' . $date_established_end . '<br>';

}

到目前为止,它产生:

1::January::2016-01-01::2016-01-31
2::February::2016-02-01::2016-02-28
3::March::2016-03-01::2016-03-31
4::April::2016-04-01::2016-04-30
5::May::2016-05-01::2016-05-31
6::June::2016-06-01::2016-06-30
7::July::2016-07-01::2016-07-31
8::August::2016-08-01::2016-08-31
9::September::2016-09-01::2016-09-30
10::October::2016-10-01::2016-10-31
11::November::2016-11-01::2016-11-30
12::December::2016-12-01::2016-12-31

但是今天(2016 年 12 月 31 日),一切都搞砸了:

1::January::2016-01-01::2016-01-31
2::February::2016-03-01::2016-03-31
3::March::2016-03-01::2016-03-31 << duplicate
4::April::2016-05-01::2016-05-31
5::May::2016-05-01::2016-05-31 << duplicate
6::June::2016-07-01::2016-07-31
7::July::2016-07-01::2016-07-31 << duplicate
8::August::2016-08-01::2016-08-31
9::September::2016-10-01::2016-10-31
10::October::2016-10-01::2016-10-31 << duplicate
11::November::2016-12-01::2016-12-31
12::December::2016-12-01::2016-12-31 << duplicate

2016 年 12 月 31 日怎么了?为什么我的代码搞砸了?谢谢。

最佳答案

您的代码在这些方面失败了:

$february = strtotime('February');
echo date(DATE_ISO8601, $february);

今天,2016 年 12 月 30 日输出:

2016-03-01T00:00:00+0000

嗯……为什么 PHP 说“二月”是“2016-03-01”?好吧,这与 PHP 如何填补缺失信息的空白有关:在没有明确给出绝对时间值的情况下,PHP 使用当前日期和时间的值。

因此,由于现在是东部时间 12 月 30 日 13:29,因此以下内容在语义上是等价的:

strtotime('February');                       // you asked for
strtotime('February 30, 2016 13:29:47 EST'); // PHP interprets as
// ^^^^^^^^^^^^^^^^^^^^^ filled in from current time

很明显,后者的解释日期是伪造的。 PHP(实际上通过底层库)使用 2 月 30 日 = 2 月 29 日 + 1 天 = 3 月 1 日的逻辑移动解释日期。(更糟糕的是,在像 2017 年这样的非闰年,PHP 将计算 2 月 30 日 = 2 月 28 日 + 2 天 = 3 月 2 日,输出将为“2017-03-02T00:00:00+0000”!)

因此,在这些情况下,当您要求 PHP 进行日期转换时,您需要做的是明确说明。这意味着不是要求 strtotime('February'); 你要求:

$year = date('Y');
$date_established = strtotime("$monthName 1, $year");

(或等价物。重点是:不要让 PHP 用当前日期的值填充缺失的信息。)

旁白:这些错误特别难以追踪,因为当月的当前天数小于要求的月天数时,代码“有效”。根据我的经验,最好避免使用 strtotime,除非您绝对需要,并且当您确实需要它时,您会尽可能多地提供明确的信息。

关于php - 为什么这个日期功能只能在 2016 年 12 月 30 日之前使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41400762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com