检查两个PHP日期时间对象是否设置为相同的日期(忽略时间)

Dav*_*haw 43 php datetime

我只想比较2个日期时间对象,看它们是否设置为相同的日期,但我不关心该对象的时间组件.目前我正在使用date_format命令来提取像'Ymd'这样的字符串进行比较,但这看起来很尴尬.

$firstDate = date_format($firstDateTimeObj, 'Y-m-d');
$secondDate = date_format($secondDateTimeObj, 'Y-m-d');

if !($firstDate == $secondDate) {

// some code
}
Run Code Online (Sandbox Code Playgroud)

我是编程和PHP的新手,所以任何指针都赞赏.

Eve*_*ert 55

使用对象语法!

$firstDate = $firstDateTimeObj->format('Y-m-d');
$secondDate = $secondDateTimeObj->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)

你的if表达非常接近,但是!运算符必须在括号内.

if (!($firstDate == $secondDate))
Run Code Online (Sandbox Code Playgroud)

这也可以表示为

if ($firstDate != $secondDate)
Run Code Online (Sandbox Code Playgroud)

  • 通过这种方式,您将无法比较日期(<,<=,> ...) (9认同)
  • @TeChn4K:使用DateTime对象,你*将*. (3认同)
  • 你也可以`$ diff =($ d1-> format("Ymd") - $ d2-> form("Ymd"))`.它更加明智. (2认同)
  • 您**可以**准确地将“Ymd”格式的日期与任何[比较运算符](https://www.php.net/manual/en/language.operators.comparison.php)进行比较,因为 PHP 词法分析器会解释这些值当日期和月份有前导零时适当。它相当于使用 [`strcmp('A10', 'A02')`](https://www.php.net/manual/en/function.strcmp.php) 以及 `sort` 如何在字符串上工作。 . 示例:https://3v4l.org/BfI00 但是,由于缺少前导零,您无法准确比较“Ynj”格式的日期。即 `"A10" &gt; "A2" = false`,请改用 `strnatcmp('A10', 'A2') &gt; 0`。 (2认同)

lon*_*day 13

我的第一个答案是完全错误的,所以我开始一个新的.

如其他答案所示,最简单的方法是date_format.这几乎可以肯定是要走的路.但是,还有另一种方法可以利用DateTime类的全部功能.使用diff创建一个DateInterval实例,然后检查其d属性:如果是0,那是同一天.

// procedural
$diff = date_diff($firstDateTimeObj, $secondDateTimeObj);

// object-oriented
$diff = $firstDateTimeObj->diff($secondDateTimeObj);

if ($diff->format('%a') === '0') {
    // do stuff
} else {
    // do other stuff
}
Run Code Online (Sandbox Code Playgroud)

请注意,对于此实例,这几乎肯定是过度杀伤,但如果您希望将来执行更复杂的操作,这可能是一种有用的技术.

  • 实际上这并不适用于所有情况.只有在绝对确定两个DateTime对象具有相同的时间时才有效.例如:如果您有2个日期时间,其中一个时间设置为2月11日22:00:00,另一个设置为2012年12月12日20:00:00它将被视为具有相同的日期时间分钟时间不到24小时. (11认同)
  • @lonesomeday您的格式字符串错误,格式字符前需要DateInterval格式.它应该是`format('%a')` (3认同)
  • 如果一个日期时间是'2014-03-28 10:00'而另一个是'2014-03-27 17:00',这也将失败.相隔不到二十四小时,因此间隔只会显示不同的小时数. (2认同)

Wes*_*orp 10

我认为你的方法很好,但我会删除它,-因为它们没有添加任何东西.

$firstDate = date_format($firstDateTimeObj, 'Ymd');
$secondDate = date_format($secondDateTimeObj, 'Ymd');

if ($firstDate != $secondDate) {
    // some code
}
Run Code Online (Sandbox Code Playgroud)


its*_*zad 6

这对我很有用。

$date1=DateTime::createFromFormat('Y-m-d H:i:s', '2014-07-31 07:30:00')->format('Y-m-d');
$date2=DateTime::createFromFormat('Y-m-d H:i:s', '2014-08-01 17:30:00')->format('Y-m-d');
if($date1==$date2){
    echo "==";
}else{
    echo "!=";
}
Run Code Online (Sandbox Code Playgroud)


小智 6

搜索具有相同问题的答案..我找到了对我来说更好的解决方案,然后使用diff或其他方法。

主要问题是忽略对象DateTime的时间部分,仅将其设置为时间,例如12:00:00

$firstDateTimeObj->setTime(12, 0, 0);
$secondDateTimeObj->setTime(12, 0, 0);

// The main problem was checking if different.. but you can use any comparison
if ($firstDateTimeObj != $secondDateTimeObj) {
}
Run Code Online (Sandbox Code Playgroud)

  • 小心!$ DateTimeObj-&gt; setTime(12,0,0);`将修改原始的DateTime对象!如果要遵循这种方法,则应先“克隆” DateTime对象,然后修改时间并比较克隆的对象。 (2认同)

TeC*_*n4K -1

strtotime 将文本日期转换为 Unix 时间戳:http://fr.php.net/manual/en/function.strtotime.php

$first = strtotime(date_format($firstDateTimeObj, 'Y-m-d'));
$second = strtotime(date_format($secondDateTimeObj, 'Y-m-d'));

if ($first != $second) {

// some code
}
Run Code Online (Sandbox Code Playgroud)

并且 :

if ($first > $second) {
// some code
}

if ($first < $second) {
// some code
}
Run Code Online (Sandbox Code Playgroud)