상세 컨텐츠

본문 제목

[PHP] php 날짜 포맷 변경하기 / DB에서 조회한 날짜 기호 변경 / 많이 쓰는 시간 포맷

PHP

by Jjiveloper 2022. 3. 22. 11:10

본문

728x90

DB에서 조회해온 날짜의 포맷을 변경해서 화면에 뿌려줘야할 일이 참 많다...

기호가 통일되지 않은 것도 많고 (ex_ yyyy.mm.dd 또는 yyyy-mm-dd 등)

어디에서는 년도만 뿌려주고... 년 월 일 다 뿌려줘야할 때도 있고,

시간만 뿌려줘야할 때도 있다..^^

 

이럴땐 역시 함수로 만들어놓고 갖다쓰는게 젤 나은듯

거두절미하고 코드부터 보자.

/** 날짜를 원하는 포맷으로 변경해준다.
 * @param string|int $date 날짜
 * @param string $format 원하는 날짜 포맷
 * 
 * @return string 변환된 날짜 문자열
 */
function dateFormatting(string|int $date, string $format = 'Y-m-d'): string
{
  if (gettype($date) === "integer" || gettype($date) === "int") {
    $date = date('Y-m-d H:i:s', $date);
  }

  $dateTime = new DateTime($date);
  return $dateTime->format($format);
}

매개변수로 날짜 값(문자열 또는 time(): integer)과 변환할 포맷을 가져온다.

integer는 날짜 매개변수를 time()으로 넣어줄 때를 위해 받아준다.

 

물론 이렇게 타입 체크해서 int면 다시 string으로 변경해주긴하지만...

지금 생각해보면 time()같은 timestamp 넣어줄거면 date() 쓰는게 나을듯?

 

그리고 DateTime 객체를 이용한다.

date() 함수도 존재하지만 걔는 시간을 int형으로 보내줘야해서

db에서 데이터를 조회해왔을 때는 사용하질 못해서 DateTime()객체를 사용하기로 했다.

 

마지막으론 날짜를 DateTime 객체로 변환 후

DateTime 내의 format 함수를 이용해 포맷을 변경해준다.

 

별거없음!!


매개변수 $format은 본인이 자주 쓰는 포맷을 기본값으로 넣어주면 편할 듯

나는 년월일만 - 하이픈 넣어서 뿌려줄 일이 많아서 기본값을 저렇게 해줬음

 

포맷에 관한건 아래 공식문서의 "The following characters are recognized in the format parameter string" 부분의 표를 참고하면 될 것 같다.

 

엥간한 날짜 포맷은 모든 언어가 비슷하게 사용되고 있어서 어려울 건 없을 것 같다.

 

자주 쓰는 시간 포맷

포맷 결과
Y 년도 4자리 숫자
m 월 2자리 숫자 (1~9월은 앞에 0이 붙음)
d 일 2자리 숫자 (1~9월은 앞에 0이 붙음)
j 일 숫자 (1~9월은 앞에 0이 안붙음)
D 요일 영문 약어(ex_ Mon, Tue 등)
H 시 24시간 포맷 (오후 1시 >> 13 반환)
h 시 12시간 시간 포맷 (오후 1시 >> 01 반환)
i (한자리 수 앞에 0이 붙음)
s 초 (한자리 수 앞에 0이 붙음)

 

자세한건 아래 공식 문서 참고하시길!


DateTime format에 관한 공식문서

https://www.php.net/manual/en/datetime.format.php

 

PHP: DateTime::format - Manual

The udate function is a great start, but the formatting of the milliseconds is a little off. If it is within the first 100000 microseconds then the string will be less than 6 characters, so 0.012435 will appear as 0.12345. The revision below fixes this.fun

www.php.net


여기서부턴 그냥 개인적인 생각 끄적끄적 안봐도 되는 부분입니당.

date_format(date_create(날짜), 포맷);

글을 쓰면서야 공식문서를 조금 읽어봤는데, new DateTime(날짜)->format(포맷)은 결국 위의 코드와 동일한 것이다.

둘의 결과는 동일하다...

 

처리 결과에 있어서 뭐가 더 빠른지 테스트가 필요하겠지만

기존에 함수에 썼던 코드가 더 빠르지 않으려나...?

 

찾아보니 date_create()도 DateTime 객체를 생성해주는 생성자 함수였고

https://www.php.net/manual/en/function.date-create.php

 

PHP: date_create - Manual

Notice php by default assume the give string as such format:'-'    is    'y-m-d''/'    is    'm/d/y'Unless the given string has Y or M,that is year is written as full year '2019', or month is written as English shorthand 'Jan', the default assumpti

www.php.net

date_format() 또한 DateTime의 format함수를 꺼내 쓰는거였군

https://www.php.net/manual/en/function.date-format.php

 

PHP: date_format - Manual

Requirements: PHP5+ To expand on Matt Walsh's example, a simple way to get eBay, or Amazon, web service timestamps is as follows: <!--?php $current_time = urlEncode(subStr(date("c"), 0, 19)."Z"); ?--> In other words, take the date/time of now (in ISO 8601

www.php.net

 

다만 new DateTime(날짜)->format(포맷)은 php 5.2.1이상부터 지원하는데 반면

date_format(date_create(날짜), 포맷)은 php 5.2.0이상부터 지원해주니까

상황에 맞게, 또 더 맘에드는 코드를 쓰면 될 것 같다!

 

728x90
반응형

관련글 더보기