3

この形式の日付から開始します。2011-05-01 09:00:00、その年のすべての営業日(つまり、すべての土曜日と日曜日を除く)のすべての営業時間(09:00〜17:00)を含む配列を作成するにはどうすればよいですか。私が到着したいのは次のようなものです:

2011-05-01 09:00:00
2011-05-01 10:00:00
2011-05-01 11:00:00
2011-05-01 12:00:00
2011-05-01 13:00:00
2011-05-01 14:00:00
2011-05-01 15:00:00
2011-05-01 16:00:00
2011-05-01 17:00:00
//next day, starting at 09:00 and ending at 17:00
2011-05-02 09:00:00
...
2011-05-02 17:00:00
//until the last day of the year from 09:00 to 17:00
2011-12-31 09:00:00
...
2011-12-31 17:00:00

開始日は当月の最初の時刻であり、時刻は09:00であり、最後の日付(配列の最後の要素)は常に年の最後の日の17:00になります。

繰り返しますが、週末は除外する必要があります。

擬似コードのアイデア:strtotime($start, "+1 one hour")はチェックのようなものを考えまし"if smaller than 17:00"たが、それはそれほど単純ではないようです。

4

7 に答える 7

5

これはどう:

$start = strtotime('2011-05-01');
$end = strtotime('2011-12-31');

$times = array();

for ($i = $start; $i <= $end; $i += 24 * 3600)
{
    if (date("D", $i) == "Sun" || date("D", $i) == "Sat")
    {
        continue;
    }

    for ($j = 9; $j <= 17; $j++)
    {
        $times []= date("Y-m-d $j:00:00", $i);
    }
}

外側のループは、指定された期間のすべての日を反復します。外側のループでは、その日が土曜日か日曜日 (週末) かどうかを確認し、そうである場合はその日をスキップします。週末でない場合は、すべての有効な時間をループして、完全な日付と時刻を配列に追加します。

于 2011-05-24T13:56:34.457 に答える
1

いくつかのヒント:

  1. date("G", $some_timestamp)1 日の時間を 24 時間形式で表示します
  2. date("N", $some_timestamp)1 (月曜日) から 7 (日曜日) までの曜日を返します。

のphpマニュアルをdate見てください。

編集:任意の開始タイムスタンプを選択し、3600 を追加して 1 時間を追加できます。時間が 17 を超える場合は、週末と同じように翌朝に進むためにより大きなステップを追加できます。while ($timestamp < $end_timestamp) {}

于 2011-05-24T13:49:22.903 に答える
1
$datetime = new DateTime(); // Set your start date here
do { // Iterate over .. dont know, a long time?
  do { // Iterate over the week ...
    $datetime->setTime(9,0,0);
    do { // Iterate over the hours ...
      echo $datetime->format('c') . PHP_EOL; // Do something with $datetime here
      $datetime->add(new DateInterval('PT1H'));
    } while ($datetime->format('G') < 18); // .. till < 18
    $datetime->add(new DateInterval('P1D')); // next day
  } while (!in_array($datetime->format('w'), array('0','6'))); // until we hit sunday or saturday
  $datetime->add(new DateInterval('P2D')); // next monday
} while (true); // replace with your "end" expression

現在テストされていません。

一般的な間隔文字列 (など1 hour) も使用できますhttp://php.net/dateinterval.createfromdatestring

于 2011-05-24T13:58:12.613 に答える
0

これは、文字列比較を使用せず、ループ内に 2 つの関数呼び出ししかないため、かなり高速なソリューションです。

function hours()
{
    $start = mktime(0, 0, 0, date('n'), 1, date('Y'));
    $end = mktime(0, 0, 0, 1, 1, date('Y') + 1);
    $wday = date('w', $start);
    $result = array();
    for ($t = $start; $t < $end; $t += 3600 * 24) {
        if (($wday > 0) && ($wday < 6)) {
            for ($hour = 9; $hour <= 17; $hour++) {
                $result[] = date('Y-m-d', $t) . sprintf(' %02d:00:00', $hour);
            }
        }
        $wday = ($wday + 1) % 7;
    }
    return $result;
}
于 2011-05-24T17:34:09.170 に答える
0

ネストされた 2 つのループで日付を計算し、date() で文字列を生成できます。

于 2011-05-24T13:48:49.420 に答える
0

now次のように、年末までのすべての日付を 1 時間単位でループするだけです(明らかに疑似コードです)。

for n = now until end of year
    if (date(n) is between 9:00 and 17:00) AND (if date(n) is not sat or sun)
        add to array
    end if
    increment n by 1 hour
end
于 2011-05-24T13:55:18.823 に答える
0

素晴らしいDateTimeクラスとその関連クラスを使用することをお勧めします。ここでは、以下をうまく利用できますDatePeriod

<?php

$now = new DateTime('today'); // starting time 0.00 this morning
$endOfYear = new DateTime('31 December this year 23:00'); // end time
$interval = new DateInterval('PT1H'); // frequency -- every hour

$times = array();

foreach (new DatePeriod($now, $interval, $endOfYear ) as $datetime) {
// $datetime is a DateTime object for the hour and time in question
    $dow = $datetime->format('w'); // 0 is Sunday
    if (($dow == '0') || ($dow == '6')) {
        continue; // miss Saturday and Sunday out
    }

    $time = $datetime->format('G'); // hour without leading 0
    if (($time < '9') || ($time > '17')) {
        continue;
    }

    $times[] = $datetime->format('r'); // output format
}

var_dump($times);

明らかに、これにはさまざまな側面があり、特に出力形式を構成できます。目的によっては、DateTime オブジェクト自体を配列に入れたい場合があります。

于 2011-05-24T14:01:47.920 に答える