【问题标题】:Check if start/end date are in a range of dates without missing days/interruptions/holes (PHP)检查开始/结束日期是否在没有丢失日期/中断/漏洞的日期范围内(PHP)
【发布时间】:2022-02-18 00:43:36
【问题描述】:

我需要检查开始/结束日期是否在一个日期范围内,并且它们之间没有丢失日期/中断/漏洞。

$dates_list 可能很大(包含多年的天数),因此性能很重要。如果需要,可以使用最新的 PHP 8.1。

我的 $dates_list 已经在数组中按时间顺序排列。

<?php

function dates_in_consecutive_range(string $start_date, string $end_date, array $dates_list): bool {
    // If in consecutive range without missing days (holes), return true, else return false
    // If either $start_date or $end_date or both is not in $dates_list, return false
    return false;
}

$dates_list = [
    '2022-03-11',
    '2022-03-12',
    '2022-03-13',
    '2022-03-14',
    '2022-03-18',
    '2022-03-19',
];

$start_date = '2022-03-11';
$end_date = '2022-03-14';

var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // true

$start_date = '2022-03-11';
$end_date = '2022-03-18';

var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // false

$start_date = '2022-03-18';
$end_date = '2022-03-19';

var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // true

$start_date = '2022-03-19';
$end_date = '2022-03-20';

var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // false ($end_date not in $dates_list)

示例:https://3v4l.org/hfk5D#v8.1.3

【问题讨论】:

    标签: php date datetime


    【解决方案1】:

    您在这方面有什么问题?您的 cmets 具有逻辑,因此只需执行它们即可:

    // If either $start_date or $end_date or both is not in $dates_list, return false
    if (!in_array($start_date, $dates_list) || !in_array($end_date, $dates_list)) {
        return false;
    }
    

    为了对$dates_list 进行迭代,我们可以使用DateTime 类来创建$start_date$end_date 之间的日期范围:

    // If in consecutive range without missing days (holes), return true, else return false
    $start_dt = new DateTime($start_date);
    $end_dt = new DateTime($end_date);
    
    $interval = DateInterval::createFromDateString('1 day');
    $period = new DatePeriod($start_dt, $interval, $end_dt);
    
    foreach ($period as $dt) {
        $curr_date = $dt->format("Y-m-d");
        if (!in_array($curr_date, $dates_list)) {
            return false;
        }
    }
    

    把它们放在一起,你会得到以下结果:https://3v4l.org/6FcL2#v8.1.3

    【讨论】:

      【解决方案2】:

      我认为这应该有效,如果无效,请告诉我。它返回 true、true、true、false,尽管您的代码状态的 cmets 中的第二个应该返回 false,但两个值都在数组内

          <?php
      
      function dates_in_consecutive_range(string $start_date, string $end_date, array $dates_list): bool {
          // If in consecutive range without missing days (holes), return true, else return false
          // If either $start_date or $end_date or both is not in $dates_list, return false
        if(in_array($start_date, $dates_list) <= in_array($end_date, $dates_list)){
          return true;
        }
      else {
        return false;
      }
      }
      
      $dates_list = [
          '2022-03-11',
          '2022-03-12',
          '2022-03-13',
          '2022-03-14',
          '2022-03-18',
          '2022-03-19',
      ];
      
      $start_date = '2022-03-11';
      $end_date = '2022-03-14';
      
      var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // true
      
      $start_date = '2022-03-11';
      $end_date = '2022-03-18';
      
      var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // false
      
      $start_date = '2022-03-18';
      $end_date = '2022-03-19';
      
      var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // true
      
      $start_date = '2022-03-19';
      $end_date = '2022-03-20';
      
      var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // false ($end_date not in $dates_list)
      

      【讨论】:

      • 嘿,不幸的是,这将在第二个示例中失败。我假设至少应该使用 DateTime 类对字符串进行一些日期解析,然后检查日期是否是连续的。
      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 2019-07-11
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      相关资源
      最近更新 更多