0

を使用してphpで月間隔を取得するにはどうすればよいですかDateInterval

開始日として2015 年 8 月 5 日を選択し、終了日として2015 年 10 月 17 日を選択した場合、配列出力は 3 つの配列に分割されます。

  • 2015 年 8 月 5 日から2015 年 8 月 31 日までの最初の配列
  • 2015 年 9 月 1 日から2015 年 9 月 30 日までの 2 番目の配列
  • 2015 年 10 月 1 日から2015 年 10 月 17 日の 3 番目のアレイ

DateIntervalPHP関数でこのことを達成できますか?

4

2 に答える 2

1

これは、PHP の便利な組み込みの Date/Time クラスのいくつかに慣れていれば、非常に簡単です。

DateTimeDateIntervalおよびを使用DatePeriodして結果を得ることができます。例えば:

<?php

// create start/end dates and interval
$start    = new DateTime('05 Aug 2015');
$end      = new DateTime('17 Oct 2015');
$interval = new DateInterval('P1D');

// DatePeriod excludes the last day
// so bump the end date by one
$end->modify('+1 day');

// create a DatePeriod for each day in range
$period = new DatePeriod($start, $interval, $end);

$months = [];

foreach ($period as $date) {
    $months[$date->format('F')][] = $date->format('m/d/Y');
}

print_r($months);

収量:

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

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

    [October] => Array
        (
            [0] => 10/01/2015
            [1] => 10/02/2015
            [2] => 10/03/2015
            [3] => 10/04/2015
            [4] => 10/05/2015
            [5] => 10/06/2015
            [6] => 10/07/2015
            [7] => 10/08/2015
            [8] => 10/09/2015
            [9] => 10/10/2015
            [10] => 10/11/2015
            [11] => 10/12/2015
            [12] => 10/13/2015
            [13] => 10/14/2015
            [14] => 10/15/2015
            [15] => 10/16/2015
            [16] => 10/17/2015
        )

)

注: 結果を 3 つの個別の配列に分割することを指定しました。結果は動的になると思います-月数が異なる可能性があります-そのため、結果の多次元配列を生成する方が良いと思います。

上記の例では、月の名前をキーとして使用しました。January や March など、月$date->format('F')の完全なテキスト表現を返します。

配列に含まれる月のリストを取得したい場合は、次のように$monthsします。

print_r(array_keys($months));

これはキーを返し、必要に応じてデータにアクセスするのに十分な情報を提供するはずです:

Array
(
    [0] => August
    [1] => September
    [2] => October
)

お役に立てれば :)

于 2015-08-07T10:17:17.880 に答える
1

以下のコードを試すことができます。確信はありませんが、あなたが探しているものを手に入れることができるかもしれません

$interval = DateInterval::createFromDateString('1 month');
$period   = new DatePeriod($d1, $interval, $d2);

foreach ($period as $dt) {

if($dt->format("Y-m") == date("Y-m", strtotime($date1))){
 $date_array[$dt->format("Y-m")] = array(
  'start_date' => $startDate,
  'end_date' => $dt->format("Y-m-t"),
 );
}else if($dt->format("Y-m") == date("Y-m", strtotime($date2))){
 $date_array[$dt->format("Y-m")] = array(
  'start_date' => $dt->format("Y-m-").'01',
  'end_date' => $endDate,
 );
}else{
 $date_array[$dt->format("Y-m")] = array(
  'start_date' => $dt->format("Y-m-").'01',
  'end_date' => $dt->format("Y-m-t"),
 );
}
}

foreach( $date_array as $d_key=>$da ){
    /* your stuff */
}
于 2015-08-21T16:03:28.263 に答える