Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP检查两个日期时间是否不在同一日历日_Php_Date_Datetime - Fatal编程技术网

PHP检查两个日期时间是否不在同一日历日

PHP检查两个日期时间是否不在同一日历日,php,date,datetime,Php,Date,Datetime,我有两次这样的约会(日期实际上是$vars) 我面临一个(可能相当)简单的问题:如何确定这两个日期是否在不同的日历日 我不能我认为这是使用字符串进行日期计算的少数情况之一: function onDifferentDays(\DateTimeInterface $startTime, \DateTimeInterface $endTime){ return $startTime->format('Y-m-d')!==$endTime->format('Y-m-d'); }

我有两次这样的约会(日期实际上是$vars)

我面临一个(可能相当)简单的问题:如何确定这两个日期是否在不同的日历日


我不能
我认为这是使用字符串进行日期计算的少数情况之一:

function onDifferentDays(\DateTimeInterface $startTime, \DateTimeInterface $endTime){
    return $startTime->format('Y-m-d')!==$endTime->format('Y-m-d');
}
此代码应易于扩展,以包括时区

还有其他选择,但我认为它们通常不值得付出努力:

  • 按元素进行比较(日、月和年):

    • PHP
      DateTime
      类不提供专用函数,只提供
      format()
  • 将两个日期标准化为一个公共时间,并与
    =
    进行比较(而不是
    ==
    ):

    • 除非您使用的是不可变对象,否则您需要克隆输入或预期副作用

    • 您还需要确保活动时区中存在时间,尽管午夜可能足够安全


  • 不管怎样,YMMV;-)

    只需创建时间设置为00:00:00的日期:

    $startTime = \DateTime::createFromFormat('Y/m/d H:i:s', '2015/01/01 00:00:00');
    $endTime = \DateTime::createFromFormat('Y/m/d H:i:s', '2015/01/02 00:00:00');
    
    或在现有日期将时间重置为零:

    $startTime->setTime(0, 0, 0);
    $endTime->setTime(0, 0, 0);
    
    那么它应该会起作用:

    $diff = $startTime->diff($endTime);
    $days = $diff->format('%d');
    
    echo $days; // 1
    
    奖金

    如果只想处理日期,请记住在
    createFromFormat
    中将时间设置为00:00:00,或使用
    setTime
    将其重置。如果您不在
    createFromFormat
    PHP中提供时间,PHP会将其设置为当前时间:

    $date = DateTime::createFromFormat('Y-m-d', '2016-01-21');
    print $date->format('H:i:s'); //not 00:00:00
    
    要修复它,您必须:

    • 以以下格式提供00:00:00时间:

      $date=DateTime::createFromFormat('Y-m-dh:i:s','2016-01-21 00:00:00')

    • 在日期格式前加上感叹号并省略时间,这将自动将时间设置为00:00:00:

      $date=DateTime::createFromFormat(“!Y-m-d”,“2016-01-21”)

    • 重置创建后的时间:

      $date=DateTime::createFromFormat('Y-m-d','2016-01-21');
      $date->setTime(0,0)


    比较格式化日期是正确的做法:

    $a->format('Y-m-d') === $b->format('Y-m-d')
    
    如果使用碳,则有一种方法:

    $dt1->isSameDay($dt2)
    
    所以我建议用它来代替前面给出的答案


    为什么不使用类似于
    Y-m-d
    的格式对它们进行格式化并进行比较呢?你到底想做什么?我希望上面的例子给出1,因为这意味着这些日期时间之间有一天
    $isSameCalendarDay=$d1->format('Y-m-d')=====$d2->format('Y-m-d')
    ?你需要使用
    diff()
    DateTime
    对象上,不是由
    format()
    生成的字符串。这几乎就是我想要的,但我需要的不是真/假,而是天数,因此2015/01/01 08:00和2015/01/03 17:00将输出2。但我想我自己能弄明白,所以谢谢你!好吧,我不知道你需要什么,但这是你实际上问的:-?
    setTime
    是我缺少的。谢谢值得注意的是,由于我们不再使用原始时间,计算出的差异不是真实的。你能链接该方法的文档吗?我找不到它。比较部分
    $dt->isSameDay($dt2);//同年同月同日
    这是一个古老的答案,我认为之前的问题中有一个“碳”标签,但不确定。
    $date = DateTime::createFromFormat('Y-m-d', '2016-01-21');
    print $date->format('H:i:s'); //not 00:00:00
    
    $a->format('Y-m-d') === $b->format('Y-m-d')
    
    $dt1->isSameDay($dt2)