PHP 日期让我很沮丧

时间:2020-12-31 17:22:13

标签: php datetime

我正在尝试通过往返字符串来验证 mm/yyyy 格式的输入。问题:

<?php
$datestr = "06/2017";

$realdate = DateTime::createFromFormat('m/Y', $datestr);
$datestr2 = date_format($realdate,'m/Y');

echo "date in: $datestr\n";
echo "date out: $datestr2\n";
?>

产生以下结果:

日期:06/2017
日期:07/2017

为什么第二个值每月递增?

2 个答案:

答案 0 :(得分:5)

因为您没有指定它假定的今天(31 日)的日期。没有 6 月 31 日,所以 PHP 假定为 7 月 1 日。

假设您始终使用您在示例中使用的日期格式,您可以通过为您的日期指定月份的第一天来轻松解决此问题:

$datestr = "01/06/2017";

$realdate = DateTime::createFromFormat('d/m/Y', $datestr);
$datestr2 = date_format($realdate,'m/Y');

echo "date in: $datestr\n";
echo "date out: $datestr2\n";

Demo

答案 1 :(得分:1)

没有必要包含“01”这一天。一种 !格式中的重置所有字段(年、月、日、小时、分钟、秒)。如果没有 !,所有字段都将设置为当前日期和时间。 (-> PHP Manual)

$datestr = "06/2017";

$realdate = DateTime::createFromFormat('!m/Y', $datestr);
var_dump($realdate);
/*
object(DateTime)#2 (3) {
 ["date"]=> string(26) "2017-06-01 00:00:00.000000" 
 ["timezone_type"]=> int(3) 
 ["timezone"]=> string(13) "Europe/Berlin" 
}
*/

随着!不存在的日期始终设置为 1,时间设置为 00:00:00。如果只设置了日期,如 John Conde 的解决方案,则日期始终包含当前时间。

相关问题