[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일째. 일요일이라고 되어있습니다.

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

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

 

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

 

 

 

 

요렇게!

그리고 확인!

 

 

아.. .서명... ㅠㅠ

서명이 완전 가렸지만... 암튼 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