[PHP] 날짜 입력해서 해당 월 주차 구하기 - 주의 시작은 월요일!

2022. 10. 13. 17:01기술집/WEB관련

728x90

이번에 제목처럼 해당 월 주차를 구해야하는 일이 생겨서 한번 검색을 해봤습니다.

너무 복잡해서 걍 복붙해서 쓸까..하다가 한번 알아봤는데..

 

그냥 든 생각은...

 

해당 월 1일의 주차, 말일의 주차, 해당일의 주차를 구해서 빼면 되는거 아냐???

 

아주 단순하게 시작한 이 작업은 무려 세번의 수정을 거쳐서

제 구실은 하게 되었습니다 ㅋㅋㅋㅋㅋㅋㅋㅋ

간편하고 좋은 코드는 아니지만 그래도 나름의 결과물이라서 기록 해 봅니다.

 

 

이번 년도, 이번달, 오늘 년월일을 준비합니다.

그리고 이달 1일은 년도, 이번달에 01을 붙여서 만ㄴ들고

말일은 date 함수의 t 를 이용하면 됩니다.

 

여기서 오늘, 이달의 1일, 이달의 말일이 구해졌습니다.

 

 

여기서는 주차를 구합니다.

1일의 주차.

오늘의 주차.

말일의 주차.

 

지금보면 말일의 주차는 필요 없습니다 ;;;

 

 

여기서는... 이제 오늘이 몇주차인지를 계산합니다.

PHP 함수 date("W") 를 이용하면 입력된 날짜가 몇주차인지 알려주는데요.

월 단위가 아닌 년 단위입니다.

 

그래서 현재 주차 - 1일 주차 = 해당 월 주차. 라는 생각으로 뺐습니다.

그리고, 1일이 무슨요일인지에 따라 시작에 변화를 줍니다.

 

왜? 저는 주간문서 작성시 표시할거라서.. 금요일에 쓰면 한주가 없잖아요?

때문에 목요일보다 작을때만 +1 합니다.

1일이 32주차. 오늘이 3일인데 같은주에 있으면 0주차가 되거든요.

1일이 월~목이면 +1. 1주차가 되는것이고.

1일이 금요일이면 0주차 그대로 가는거죠.

만약 금요일이라면 주간문서 작성은 다음주가 될 테니까요.

 

대략 저렇게 만들어놓고 한번 출력을 해 보니.. 잘 움직입니다.

그래서 함수로 만들었습니다.

 

 

PHP 날짜 입력해서 해당 월 주차 알아내는 함수입니다.

달라진건 년도, 해당 월을 date로 하는게 아니라 입력받은 날짜에서 list로 나눠줬습니다.

나머지는 다 똑같습니다.

그럼 출력물을 한번 보겠습니다.

 

 

음... 완벽해.. 후훗.

그런데 이대로 끝내면... 안되겠죠??

당연히 여러 상황에서의 테스트가 있어야합니다.

다른 고수분들의 코드가... 이렇게 쉽게 구현될 리가 없거든요.

뭔가 생각을 놓친부분이 절대로 있다!!!

 

 

8월로 한번 해 봅니다.

 


 

우연히 찍은 날짜가.. 일요일이었는데 주차가 다르다...???

달력에 한줄로 되어있는 일요일과 월요일이 주차가 다릅니다.

음...

그렇죠. 해외는 월요일부터 시작이죠?

성경에서도 6일동안 열심히 세상을 만드신 하느님이 하루 쉰 날이 7일째. 일요일이라고 되어있습니다.

제가 어릴때에는 분명 주의 시작이 월요일이었는데..

언제부터 일요일이 앞으로 오더라구요???

 

암튼. 그래서 일요일인 경우는 주차를 하나 올려줍니다.

 

 

728x90

 

 

요렇게!

그리고 확인!

 

 

아.. .서명... ㅠㅠ

서명이 완전 가렸지만... 암튼 4주차로 잘 먹힙니다.

이로써... 모든것이 끝난건가??

그래도 너무 쉽게 끝난것 같은데...

지정된 일자의 해당 월 주차 구하는게 이렇게 쉬웠다고????

다른 케이스를 한번 더 찾아봅니다.

 

 

7월... 제대로 잘 먹힙니다. 첨에 0주차라고 나오는걸보고 뭔가 잘못되었다고 생각했는데...

1일이 금요일이니 주차가 안먹히는게 맞죠. 제 코드에서는요 ㅎㅎㅎㅎ

진짜 끝인가..????

 

아싸가오리~!!! 하면서 1일 기준으로 내려갑니다.

6월..5월....

5월???????

 

 

어.... 왜 5월은 2주차로 시작인거지 ;;;;;

일요일이니 1주차로 해야지....

 

가만 생각해보니.. 일요일은 date("w") 로 끄집어냈을때 0 입니다.

와...

시작은 월요일인데 함수 결과값은 일요일이 시작이야...

뭐냐 이 코쟁이들아 ;;;;

 

어떻게 date("W") 와 date("w") 의 기준이 이렇게나 다를수가 있는거죠? ㅋㅋㅋㅋㅋㅋ

아무튼...

1일이 일요일이니 0 이라서 주차 1 뿌라스...

그 밑에 일요일이니까 1 뿌라스.

그래서 1주차가 아닌 2주차로 나왔습니다.

 

 

원인만 알면 고쳐야죠? ㅋ

0보다 크고 4보다 같거나 작을경우에 뿌라스해줍니다.

그럼 1일이 일요일일경우에는 주차 취급을 안당합니다.

대신 이 다음에 일요일이라서 뿌라스 1 됩니다.

 

즉... 1일은 주차 뺄셈에서 조건이 안되니 0주차 그대로입니다.

만약 월~목 이었다면 if문에 걸려서 1주차가 되었겠죠.

 

이담에 일요일 조건에는 일치하니 여기서 1주차가 됩니다.

결과적으로는 1주차 되는게 맞죠.

여기까지 하고나니.. 1일이 일요일인경우, 그냥 일요일인경우.. 예외는 다 나온것 같습니다.

이거말고 없겠죠??

자신을 가지고 당당하게 적용했습니다 ㅋ

 

PHP 연간 주차는 쉽게 구하지만 해당 월 주차 구하려면 약간 손을 봐야합니다.

다른 좋은 코드들 많지만.. 일단 저도 기록용으로 ㅎㅎㅎ

 

 

더보기

/*
  1. 주차의 기준은 1일이 목요일 까지가 1주차. 금,토는 0주차.
  2. 1일이 일요일인 경우에는 1주차.
  3. PHP는 일~월이 아닌 월~일 이므로, 오늘이 일요일인경우에는 +1주차.
*/
function getWeeksDate($today){
  list($year, $month, $day) = explode("-",$today);

  $firstday = "{$year}-{$month}-01";
  $lastday = date("Y-m-t", strtotime("{$firstday}"));

  $firstweek = date("W", strtotime($firstday));
  $currweek = date("W", strtotime($today));

  $mweek = $currweek - $firstweek;
  // 1일의 시작이 요일에 따라 1주차가 바뀌는 처리
  $yo1 = date("w", strtotime($firstday));
  if($yo1 > 0 && $yo1 <= 5){
    $mweek++;
  }
  if(date("w", strtotime($today)) == 0){
    $mweek++;
  }

  return $mweek;
}

 

 

 

 

 

 

 

728x90