找出2015-01-01~2015-02-05 之間的每個星期一

在 ptt 看到的 - http://www.ptt.cc/bbs/PHP/M.1420447283.A.B27.html

就試著玩了一下

<?php

$begin = strtotime('2015-01-01');
$end = strtotime('2015-02-05');

$wdayBegin = date('w', $begin);
if ($wdayBegin === 1) {
$firstMonday = $begin;
} else {
$firstMonday = strtotime('next monday', $begin);
}
$currentTime = $firstMonday;

while ($currentTime <= $end) {
echo date('Y-m-d', $currentTime) . \"\n\";
$currentTime = strtotime('next monday', $currentTime);
}

評論

  • 我也來玩一下

    $start = '2015-01-01';
    $end = '2015-02-05';
    for($i = strtotime($start);$i <= strtotime($end);$i += 86400)
    {
    if(date('w',$i) == 1){
    echo date('Y-m-d',$i).'<br>';
    }
    }

  • <?php
    $d = new DateTime('2015-01-01');
    $d->modify('next monday');
    while($d<(new DateTime('2015-02-05'))){
    echo $d->modify('+1 week')->format(\"Y-m-d\n\");
    }
  • 越來越強大了
  • @rickysu
    你那個會少印出第一天的說~~~~~~
  • 試了一下,上面三個 Ricky 的程式跑比較快,不知道是不是因為 PHP 5.5.9 有針對物件做最佳化,因為以前透過 function call 會快一些。

    理論上這樣比較快

    $begin = strtotime('2015-01-01');
    $end = strtotime('2015-02-05');

    $wdayBegin = date('w', $begin);
    if ($wdayBegin === 1) {
    $currentTime = $begin;
    } else {
    $currentTime = strtotime('next monday', $begin);
    }

    while ($currentTime <= $end) {
    echo date('Y-m-d', $currentTime) . \"\n\";
    $currentTime += 604800;
    }
  • edited 一月 2015
    把rickysu的改成這樣就符合題目了

    <?php
    $d = new DateTime('2015-01-01');
    while($d <= (new DateTime('2015-02-05'))){
    echo $d->modify('monday')->format(\"Y-m-d\").'<br>';
    $d->modify('next monday');
    }

    測過可用。
  • $d<(new DateTime('2015-02-05')) 也許要改成 $d <= (new DateTime('2015-02-05'))

    否則如果最後一天是星期一就出錯了
  • yes!趁30分鐘沒到我偷偷改掉了。
  • 說:

    $d<(new DateTime('2015-02-05')) 也許要改成 $d <= (new DateTime('2015-02-05'))

    否則如果最後一天是星期一就出錯了</p>

    這段 Code 已經過月曆測試,2015-02-05 是星期四 XD

  • <?php
    $d = new DateTime('2015-01-01');
    $d->modify('next monday');
    while($d <= (new DateTime('2015-02-05'))){
    echo \"{$d->format('Y-m-d')}<br>\n\";
    $d->modify('+1 week');
    }

    改成這樣就不會有問題了
  • 如果在 new 之後立即移到下一個週一,起始日是週一就被漏掉了(試試 2014-12-01)。
    小改一下

    $start_day = '2014-12-01';
    $end_day = '2015-01-31';

    $test_day_obj = new DateTime($start_day);
    $end_day_obj = new DateTime($end_day);

    echo '開始日期:' . $test_day_obj->format('Y-m-d'). ' 到 ' . $end_day_obj->format('Y-m-d') . '<br>以下為週一日期<ol>';

    while( $test_day_obj <= $end_day_obj){
    if( $test_day_obj->format('w')!=1){ //這裡應該可以只檢查一次就好
    $test_day_obj->modify('next monday');
    }
    echo '<li>' . $test_day_obj->format('Y-m-d') . '</li>';
    $test_day_obj->modify('+1 week');
    }
    echo '<ol>';
    echo '<p>週期日期結束</p>';
  • UNIX timestamps 的解法也不錯

    .
    <?php
    const DAYSTAMP = 86400;
    $t = strtotime(\"2015-01-01\")+(DAYSTAMP*4); // First monday
    $n =52;

    for($i=0; $i<$n;$i++) {
    $w = $t+(DAYSTAMP*7)*$i;
    echo sprintf(\"%s:%s\n\", date('l',$w), date('Y-m-d',$w));
    }
Sign In or Register to comment.