找出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分鐘沒到我偷偷改掉了。
  • kiang wrote: »
    $d<(new DateTime('2015-02-05')) 也許要改成 $d <= (new DateTime('2015-02-05'))

    否則如果最後一天是星期一就出錯了

    這段 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.