查找缺少的日期,然后将其包含在数组中

时间:2019-03-09 06:02:32

标签: php

如何在数组中添加$ mydates(2019-04-01“,” 2019-04-08)包括?

请给我一些建议。

谢谢

我是从这里推荐的,但是只找到缺少的日期 Find missing dates in range (php)

$myDates = array("2019-04-01", "2019-04-08");
$missingDates = array();

$dateStart = date_create("2019-04-01");
$dateEnd   = date_create("2019-04-".date("t", mktime(0, 0, 0, 0, 1, 2019)));
$interval  = new DateInterval('P1D');
$period    = new DatePeriod($dateStart, $interval, $dateEnd);
foreach($period as $day) {
  $formatted = $day->format("Y-m-d");
  if(!in_array($formatted, $myDates)) $missingDates[] = $formatted;
}

echo '<pre>';print_r($missingDates);echo '</pre>';

结果

Array
(
    [0] => 2019-04-02
    [1] => 2019-04-03
    [2] => 2019-04-04
    [3] => 2019-04-05
    [4] => 2019-04-06
    [5] => 2019-04-07
    [6] => 2019-04-09
    [7] => 2019-04-10
    [8] => 2019-04-11
    [9] => 2019-04-12
    [10] => 2019-04-13
    [11] => 2019-04-14
    [12] => 2019-04-15
    [13] => 2019-04-16
    [14] => 2019-04-17
    [15] => 2019-04-18
    [16] => 2019-04-19
    [17] => 2019-04-20
    [18] => 2019-04-21
    [19] => 2019-04-22
    [20] => 2019-04-23
    [21] => 2019-04-24
    [22] => 2019-04-25
    [23] => 2019-04-26
    [24] => 2019-04-27
    [25] => 2019-04-28
    [26] => 2019-04-29
    [27] => 2019-04-30
)

1 个答案:

答案 0 :(得分:0)

尚不清楚您想要什么作为输出,但是也许其中一些会给您一些想法。

赞一下您的代码:

$missingDates = array("2019-04-01", "2019-04-08");

$dateStart = date_create("2019-04-01");
$dateEnd   = date_create("2019-04-".date("t", mktime(0, 0, 0, 0, 1, 2019)));
$interval  = new DateInterval('P1D');
$period    = new DatePeriod($dateStart, $interval, $dateEnd);
foreach($period as $day) {
  $formatted = $day->format("Y-m-d");
  if(!in_array($formatted, $missingDates)) $missingDates[] = $formatted;
}

sort($missingDates);

echo '<pre>';print_r($missingDates);echo '</pre>';

输出

Array
(
    [0] => 2019-04-01
    [1] => 2019-04-02
    [2] => 2019-04-03
    [3] => 2019-04-04
    [4] => 2019-04-05
    [5] => 2019-04-06
    [6] => 2019-04-07
    [7] => 2019-04-08
    [8] => 2019-04-09
    [9] => 2019-04-10
    [10] => 2019-04-11
    [11] => 2019-04-12
    [12] => 2019-04-13
    [13] => 2019-04-14
    [14] => 2019-04-15
    [15] => 2019-04-16
    [16] => 2019-04-17
    [17] => 2019-04-18
    [18] => 2019-04-19
    [19] => 2019-04-20
    [20] => 2019-04-21
    [21] => 2019-04-22
    [22] => 2019-04-23
    [23] => 2019-04-24
    [24] => 2019-04-25
    [25] => 2019-04-26
    [26] => 2019-04-27
    [27] => 2019-04-28
    [28] => 2019-04-29
    [29] => 2019-04-30
)

Sandbox

请注意,此2019可能会给您带来2020的一些问题

$dateEnd   = date_create("2019-04-".date("t", mktime(0, 0, 0, 0, 1, 2019)));

您无法真正解决此问题,因为在执行此操作之前,最好使用日期时间,如下所述。您将把结束日期变成日期时间对象,这样就可以得到年份(new DateTime("2019-04-08"))->format('Y'),此时最好只使用以下选项之一。您不能简单地使用$dateStart对象,因为$dateEnd可能在明年,具体取决于您的实际需求。

该月的所有天

以上基本上只为您提供了每月可以通过这种方式进行的所有工作:

function getDaysOfMonth($date){
    $dateStart = (new DateTime($date))->modify('first day of this month'); 
    $dateEnd = (new DateTime($date))->modify('first day of next month');
    $interval  = new DateInterval('P1D');
    $period    = new DatePeriod($dateStart, $interval, $dateEnd);
    $formatted = [];

    foreach($period as $day) $formatted[] = $day->format("Y-m-d");
    return $formatted;
}

print_r(getDaysOfMonth('2019-04-10'));

输出

Array
(
    [0] => 2019-04-01
    [1] => 2019-04-02
    [2] => 2019-04-03
    [3] => 2019-04-04
    [4] => 2019-04-05
    [5] => 2019-04-06
    [6] => 2019-04-07
    [7] => 2019-04-08
    [8] => 2019-04-09
    [9] => 2019-04-10
    [10] => 2019-04-11
    [11] => 2019-04-12
    [12] => 2019-04-13
    [13] => 2019-04-14
    [14] => 2019-04-15
    [15] => 2019-04-16
    [16] => 2019-04-17
    [17] => 2019-04-18
    [18] => 2019-04-19
    [19] => 2019-04-20
    [20] => 2019-04-21
    [21] => 2019-04-22
    [22] => 2019-04-23
    [23] => 2019-04-24
    [24] => 2019-04-25
    [25] => 2019-04-26
    [26] => 2019-04-27
    [27] => 2019-04-28
    [28] => 2019-04-29
    [29] => 2019-04-30
)

Sandbox

一个月的剩余天

只需在上面更改此行:

 $dateStart = (new DateTime($date))->modify('first day of this month'); 

收件人

 $dateStart = new DateTime($date); 

输出

Array
(
    [0] => 2019-04-10
    [1] => 2019-04-11
    [2] => 2019-04-12
    [3] => 2019-04-13
    [4] => 2019-04-14
    [5] => 2019-04-15
    [6] => 2019-04-16
    [7] => 2019-04-17
    [8] => 2019-04-18
    [9] => 2019-04-19
    [10] => 2019-04-20
    [11] => 2019-04-21
    [12] => 2019-04-22
    [13] => 2019-04-23
    [14] => 2019-04-24
    [15] => 2019-04-25
    [16] => 2019-04-26
    [17] => 2019-04-27
    [18] => 2019-04-28
    [19] => 2019-04-29
    [20] => 2019-04-30
)

Sandbox

开始到结束(包括结束)

这为您提供了所有的日子,但是如果您只想从第一天到第二天,可以使用此功能:

function getDays($dateStart,$dateEnd){

    $dateStart = new DateTime($dateStart); 
    $dateEnd = (new DateTime($dateEnd))->modify('+1 day'); 
    $interval  = new DateInterval('P1D');
    $period    = new DatePeriod($dateStart, $interval, $dateEnd);
    $formatted = [];

    foreach($period as $day) $formatted[] = $day->format("Y-m-d");



    return $formatted;
}

print_r(getDays('2019-04-01', '2019-04-08'));

输出

Array
(
    [0] => 2019-04-01
    [1] => 2019-04-02
    [2] => 2019-04-03
    [3] => 2019-04-04
    [4] => 2019-04-05
    [5] => 2019-04-06
    [6] => 2019-04-07
    [7] => 2019-04-08
)

Sandbox