0

今から始まる各日付(タイムスタンプ)を、毎週月曜日の特定の時間、たとえば16時30分、17時00分、14時00分に生成したいと思います。

このコードはほぼ機能しますが、時間はではなく$hours[$i]現在の時刻であり、次の月曜日ではなく現在の曜日でもあります

$hours = array('16h30', '17h00', '14h00');
for ($i = 0; $i < 3; $i++) {
    // how to specify the hour $hours[$i] ?
    $dates[] = strtotime("+$i weeks 0 days");
}

必要な出力:

monday 5 november, 16h30
monday 12 november, 16h30
monday 19 november, 16h30
...
4

3 に答える 3

1

時間から「h」を削除すると、PHPはそれらをそのまま理解し、文字列に平日の名前を入れることができます。

$hours = array('1630', '1700', '1400');
for ($i = 0; $i < 3; $i++) {
    $dates[] = strtotime("monday +$i weeks $hours[$i]");
}

残りのコードが必要な場合はh、次の目的で削除できます。

$hours = array('16h30', '17h00', '14h00');
for ($i = 0; $i < 3; $i++) {
    $dates[] = strtotime("monday +$i weeks " . 
                         join('', explode('h', $hours[$i])));
}
于 2012-11-05T11:38:17.083 に答える
1

DateTime クラスを使用したソリューションを次に示します。

/**
 * Get weekly repeating dates for an event
 *
 * Creates an array of date time objects one for each $week
 * starting at $startDate. Using the default value of 0 will return
 * an array with just the $startDate, a value of 1 will return an
 * array containing $startDate + the following week.
 *
 * @param DateTime $startDate
 * @param int optional defaults to 0 number of weeks to repeat
 * @return array of DateTime objects
 */
function getWeeklyOccurences(DateTime $startDate, $weeks = 0)
{
    $occurences = array();
    $period = new DatePeriod($startDate, new DateInterval('P1W'), $weeks);
    foreach($period as $date){
        $occurences[] = $date;
    }
    return $occurences;
}

$startDate = new datetime();
$startDate->setTime(16, 30);
var_dump(getWeeklyOccurences($startDate, 52));

次の出力が得られます:-

array (size=53)

      0 => 
        object(DateTime)[4]
          public 'date' => string '2012-11-06 16:30:00' (length=19)
          public 'timezone_type' => int 3
          public 'timezone' => string 'UTC' (length=3)
      1 => 
        object(DateTime)[5]
          public 'date' => string '2012-11-13 16:30:00' (length=19)
          public 'timezone_type' => int 3
          public 'timezone' => string 'UTC' (length=3)
      2 => 
        object(DateTime)[6]
          public 'date' => string '2012-11-20 16:30:00' (length=19)
          public 'timezone_type' => int 3
          public 'timezone' => string 'UTC' (length=3)
      3 => 
        object(DateTime)[7]
          public 'date' => string '2012-11-27 16:30:00' (length=19)
          public 'timezone_type' => int 3
          public 'timezone' => string 'UTC' (length=3)

等..

その後、必要に応じて出力をフォーマットできますDateTime::format()

于 2012-11-06T13:24:30.307 に答える
0

このようなものはどうですか:mktimeを使用して最初の日付を生成し、次にstrtotimeを使用します。

$start_date = mktime(16, 30, 0, 11, 5, 2012);
for ($i = 0; $i < 3; $i++) {
    // how to specify the hour $hours[$i] ?
    $dates[] = strtotime("+$i weeks 0 days", $start_date);
}
于 2012-11-05T11:37:02.403 に答える