如何使用 PHP 安全地解析月份?

How can I safely parse the month using PHP?

提问人:Muhammad Dyas Yaskur 提问时间:10/31/2023 最后编辑:Muhammad Dyas Yaskur 更新时间:10/31/2023 访问量:80

问:

为什么以下代码返回?应该是,对吧?12-202311-2023

$datetime = DateTime::createFromFormat('m-y', '11-23');
echo $datetime->format('m-Y');

这仅在我每月的 31 日(例如 10 月 31 日或 12 月 31 日)运行时才会发生。似乎当我们提供“11/23”作为日期时,今天是 10 月 31 日,PHP 将其解释为 11 月 1 日。当今天是 12 月 31 日时,它将其解释为次年的 1 月 1 日。

所以将被整写为 ,下面的代码将返回为:11-2331-11-2301-12-2023

$datetime = DateTime::createFromFormat('d-m-y', '31-11-23');
echo $datetime->format('d-m-Y');

我想使用此代码从信用卡/借记卡中解析月份和年份。如何使用 PHP 安全地解析月份?

我也试过了

echo date('m-Y',strtotime("10-23"));

但它回来了.01-1970

我真的需要在输入字符串前面加上日期吗?例如,如果输入是“11-23”,我是否需要在它前面添加“01-”才能使其与?DateTime::createFromFormat

php 日期时间

评论

0赞 Ivo P 10/31/2023
如果你想让它出现在月份,你可以用“01-”作为你的日期前缀,因为这个月的第一天肯定会在那里。29日、30日或31日可能会在几个月内失踪

答:

0赞 Álvaro González 10/31/2023 #1

当你用不完整的日期来馈送它时,PHP 会用当前日期/时间来填补空白。当这会产生无效日期时,PHP 会帮你“修复”它。

在撰写本文时,是 10 月 31 日。但 11 月只有 30 天,所以它提前到下个月。

$datetime = DateTime::createFromFormat('m-y', '11-23');
$now = new DateTime();
var_dump($datetime, $now)
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2023-12-01 09:48:48.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "Europe/Amsterdam"
}
object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2023-10-31 09:48:48.010803"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "Europe/Amsterdam"
}

要回答您的问题,是的,如果您不希望以数字方式填充(并且可能是错误的),则必须指定一个月中的特定日期(甚至时间)。

2赞 shingo 10/31/2023 #2

只需在格式字符串前面加上 or 即可!|

DateTime::createFromFormat('!m-y', '11-23');

文档说明:

如果 format 不包含字符 !然后是 未在格式中指定的生成日期/时间将设置为 当前系统时间。

如果 format 包含字符 !,则生成的部分 未以格式提供的日期/时间,以及左侧的值 side 的 !,将设置为来自 Unix 的相应值 时代。

评论

0赞 Álvaro González 10/31/2023
值得一提的是,Unix Epoch 是 1970 年 1 月 1 日星期四 00:00:00 UTC。