iT邦幫忙

0

php取當月至今 週別及週三日期

php
  • 分享至 

  • xImage

標題有點難下

需求主要如下

我要抓當月到今天的週別及週三日期

如果當週還沒有到週三或是當週無週三則抓上週三日期

以今天9/10為例

9月行事曆簡圖如下 (到今天9/10)

一 二 三 四 五 六 日
                  1
2  3  4  5  6  7  8
9  10

根據上圖 我要的週別及日期是W35 8/28、W36 9/5、W37 9/5

說明如下
9月從W35開始
W35 因為不是星期三 所以抓上週三的日期 所以是8/28
W36 9/5是週三 所以抓出9/5
W37 目前只到9/10(二) 所以抓上週三日期 9/5

再請各位指教

謝謝 !

-- 題目沒有說明得很清楚 我是要以週別為基準
9月是W35開始 到目前W37 所以我只取三次資料

-- 後來想到寫法了 補充如下 方法可能有點笨 但可行

//當月第一天
$first_day = date('Y/m/01',time());
//9月起始週別到目前週別
while (date('W',strtotime($first_day)) <= date('W',strtotime(date('Y/m/d')))){
  
  $week_date = new DateTime();
  $week_date->setISODate(date('Y'),date('W',strtotime($first_day)));
  $week_first_date = $week_date->format('Y/m/d');
          
  //如果該週別的週三>今天 則取上週三的日期
  if (date('Y/m/d',strtotime($week_first_date .'+2 day')) > date('Y/m/d') ){
     echo "週別: ".date('W',strtotime($week_first_date));
     echo "<br>";  
     echo "週三日期: ".date('Y/m/d',strtotime($week_first_date .'-5 day'));
     echo "<br>";
  //如果該週別的週三<=今天 則取該週三的日期
  }else{
     echo "週別: ".date('W',strtotime($week_first_date));
     echo "<br>";  
     echo "週三日期: ".date('Y/m/d',strtotime($week_first_date .'+2 day'));
     echo "<br>"; 
  }
  $first_day = date("Y/m/d",strtotime($first_day.'+7 day'));
}
看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2019-09-10 17:05:02 檢舉
https://www.php.net/manual/en/function.date.php

官方就有api可用了啊
froce iT邦大師 1 級 ‧ 2019-09-10 17:15:06 檢舉
另外怎麼可能會有沒有星期三的狀況?

簡單的邏輯就是如果是星期二以前,就出上周三和這星期的week number,不是的話就是這週三和這星期的week number,剩下的寫給得到上周三的函式,呼叫個2次。
應該不是什麼難題吧
ccutmis iT邦高手 2 級 ‧ 2019-09-10 17:55:00 檢舉
<?php
$today = date("Y-m-d");
$week_y=date('W');
$ddate = date("Y-m-01");
$date = new DateTime($ddate);
$week_m = ($week_y-$date->format("W"))+1;
$wednesday=date("Y-m-d",(date('N')<3?strtotime('Wednesday')-7*86400:(date('N')>3?strtotime('last Wednesday'):strtotime('Wednesday'))));

print_r("今天: $today 。今年第 $week_y 週。 本月第 $week_m 週。 最近的星期三是: $wednesday");
?>
我的月曆好像壞了 上星期三是9/4...
dragonH iT邦超人 5 級 ‧ 2019-09-10 18:32:52 檢舉
@ccutmis 大

我也遇過月曆壞掉的情況

後來我抱著電腦原地轉三圈後

就正常了

給你參考XD
ccutmis iT邦高手 2 級 ‧ 2019-09-10 19:03:17 檢舉
@dragonH 大:
是人正常了還是電腦正常了?! ^^"
dragonH iT邦超人 5 級 ‧ 2019-09-10 19:07:16 檢舉
你就會覺得有點累

然後慢慢發現

上星期三本來就是9/4的這個事實 XD
ccutmis iT邦高手 2 級 ‧ 2019-09-10 20:15:56 檢舉
(|||゚д゚)....
上個星期三不是9/4

是8月35日!
小魚 iT邦大師 1 級 ‧ 2019-09-10 23:59:59 檢舉
你們都搞錯了...
其實上星期,
沒有星期三...
小魚 iT邦大師 1 級 ‧ 2019-09-11 00:00:51 檢舉
@dragonH
我如果抱著電腦原地轉三圈,
可能要先學會穿牆...
dragonH iT邦超人 5 級 ‧ 2019-09-11 00:32:52 檢舉
╰(*°▽°*)╯
ccutmis iT邦高手 2 級 ‧ 2019-09-11 09:15:03 檢舉
當月第n週+星期三...問個提外話,樓主是要查哪天是台指期結算日嗎?
Neish iT邦研究生 1 級 ‧ 2019-09-11 11:26:12 檢舉
感謝大家熱心回覆
其實是公司USER顯示資料的需求 要抓每週三的資料 如果還沒到週三則抓上週三的資料

補充寫法在原文裡面

感謝各位協助 !
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
犬千賀
iT邦新手 3 級 ‧ 2019-09-11 11:13:28
最佳解答
$Start = date('Y-m-01'); // 起始日
$Today = date('Y-m-d');  // 當前日

/* 計算 起始日與上週三相差天數 0~6 */
$LastWed = date('N', strtotime( $Start ))-3;
if( $LastWed<0 ){ $LastWed+=7; }

/* 起始日扣除相差天數,得 實際起始日(週三) */
$StartWed = date('Y-m-d', strtotime( "$Start -$LastWed day" ));

echo "<pre>$StartWed ~ $Today</pre>";

$begin = strtotime( $StartWed );
while( $begin<=strtotime( $Today ) ){
    $WeekNumber = date('W',		$begin);
    $Wednesday  = date('Y-m-d', $begin);
    echo "<pre>W$WeekNumber: $Wednesday</pre>";

    $begin = strtotime( "$Wednesday +1 week" ); // 週遞增
}
Neish iT邦研究生 1 級 ‧ 2019-09-11 11:30:05 檢舉

感謝犬千賀回覆
我有補充後來的寫法在原文中

你的解法剛好也符合我的需求
最佳解就給你了
Thanks !

犬千賀 iT邦新手 3 級 ‧ 2019-09-11 11:39:00 檢舉

謝謝 =DDD
其實就是列出週三而已... 不用想太複雜了啦 ^ ^

1
海綿寶寶
iT邦大神 1 級 ‧ 2019-09-10 21:44:02

標題也可以下
給定日期範圍,取得不重覆的前一個星期三的日期及週別

<?php

$begin = new DateTime( '2019-09-01' );
$end = new DateTime( '2019-09-10' );

$date = $begin;
while ($date <= $end) {
	if (date("w", $date->getTimestamp())==3) {	//若是星期三就是本星期三
		$wed = strtotime("wednesday", $date->getTimestamp());
	} else {									//若不是星期三就取前一個星期三
		$wed = strtotime("last wednesday", $date->getTimestamp());
	}
	$weekOfYear = date("W", $date->getTimestamp());
	echo date("Y/m/d", $date->getTimestamp())." "."W".$weekOfYear." ".date('Y/m/d',$wed) . "\n";
	
	$date->add(new DateInterval('P1D'));
}
?>

選我正解


9月 2019         
日 一 二 三 四 五 六  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30    

星期日是一週的開始....所以這個要不要調整一下呢?

Neish iT邦研究生 1 級 ‧ 2019-09-11 11:17:52 檢舉

感謝海綿寶寶回覆 上述作法會以9/1~9/10抓10次週別跟週三日期
抱歉問題沒有描述的很清楚 我主要是想要以週別為基礎 只跑3次(W35、W36、W37)來取週別跟週三日期

後來想到的寫法我補充在文章內

感謝協助 !

您是跟樓主講還是跟我講?
如果是跟我講
答案是
不要

我根本就不知道做這個的意義是什麼
那還在乎誰是一週的開始

/images/emoticon/emoticon73.gif

0
froce
iT邦大師 1 級 ‧ 2019-09-12 19:44:18

https://ideone.com/0j03Hd
不過因為是用iso標準,一星期第一天是星期一。
都用最基本的date功能而已,PHP應該都有相對應的。

from datetime import date, timedelta

def getLastWed(d):
	if d.isoweekday() >= 3:
		delta = d.isoweekday() - 3
	else:
		delta = d.isoweekday() + 7 - 3
	return d - timedelta(days=delta)
	
def getLast3WedInMonth(d):
	weeknum = d.isocalendar()[1]
	startWeeknum = date(d.year, d.month, 1).isocalendar()[1]
	if d.isoweekday() >= 3:
		thisWed = getLastWed(d)
		lastWed = getLastWed(thisWed - timedelta(days=1))
		last2Wed = getLastWed(lastWed - timedelta(days=1))
	else:
		thisWed = getLastWed(d)
		lastWed = thisWed
		last2Wed = getLastWed(lastWed - timedelta(days=1))

	return list(filter(lambda x: x["weeknumber"] >= startWeeknum, 
	    [
			{"weeknumber": weeknum-2, 'date': last2Wed},
			{"weeknumber": weeknum-1, 'date': lastWed},
			{"weeknumber": weeknum, 'date': thisWed}
		]))
		
print(getLast3WedInMonth(date.today()))
print(getLast3WedInMonth(date(2019, 9, 11)))
print(getLast3WedInMonth(date(2019, 9, 10)))
print(getLast3WedInMonth(date(2019, 9, 4)))

看不懂幹嘛要定基準日...

我要發表回答

立即登入回答