PHP에서 날짜 형식을 다른 형식으로 변환


336

PHP에서 한 날짜 형식을 다른 날짜 형식으로 변환하는 간단한 방법이 있습니까?

나는 이것을 가지고있다:

$old_date = date('y-m-d-h-i-s');            // works

$middle = strtotime($old_date);             // returns bool(false)

$new_date = date('Y-m-d H:i:s', $middle);   // returns 1970-01-01 00:00:00

그러나 물론 금일 새벽이 아닌 현재 날짜를 반환하고 싶습니다. 내가 뭘 잘못하고 있죠?



답변:


293

두 번째 매개 변수 date()는 적절한 타임 스탬프 여야합니다 (1970 년 1 월 1 일 이후의 초). date ()가 인식 할 수없는 문자열을 전달하고 있습니다.

strtotime () 을 사용 하여 날짜 문자열을 시간 소인으로 변환 할 수 있습니다 . 그러나 strtotime ()조차도 y-m-d-h-i-s형식을 인식하지 못합니다 .

PHP 5.3 이상

사용하십시오 DateTime::createFromFormat. date()들어오는 문자열 날짜를 구문 분석하기 위해 구문 을 사용하여 정확한 마스크를 지정할 수 있습니다 .

PHP 5.2 이하

타임 스탬프를 생성하는 mktime ()에substr() 결과를 사용하여 수동으로 요소 (년, 월, 일,시, 분, 초)를 구문 분석해야합니다 .

그러나 그것은 많은 일입니다! strftime ()이 이해할 수있는 다른 형식을 사용하는 것이 좋습니다. strftime ()은 모든 날짜 입력이 부족한 것을 이해 합니다the next time joe will slip on the ice . 예를 들어 다음과 같이 작동합니다.

$old_date = date('l, F d y h:i:s');              // returns Saturday, January 30 10 02:06:34
$old_date_timestamp = strtotime($old_date);
$new_date = date('Y-m-d H:i:s', $old_date_timestamp);   

고마워 Pekka는 방금 내 질문을 편집했지만 시도했지만 작동하지 않는 것 같습니다.
Tom

당신이 그것을 수락하는 동안 나는 대답을 편집했다 :) 나는 더 많은 예제와 참조를 추가했다.
Pekka

문제입니다. 날짜로 다시 변환 해야하는 고정 파일 이름 (해당 형식이어야 함)이므로 해결 방법을 알아 보겠습니다.
Tom

참고 : php.net에 따르면 DateTimePHP 5.2부터 PHP 코어가 존재 DateTime하며 컴파일시 PHP 5.1에 대한 실험적 지원을 활성화 할 수 있습니다. secure.php.net/manual/en/datetime.installation.php
Charlotte Dunois

108

가장 쉬운 방법은

$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('m/d/Y');

먼저 $ dateString의 형식을 제공합니다. 그런 다음 $ newDateString을 원하는 형식으로 지정합니다.

또한 strtotime을 사용하지 않아도되기 때문에 때때로 작업하기 어려울 수 있습니다.

한 날짜 형식에서 다른 날짜 형식으로 변환하지 않고 특정 형식의 현재 날짜 (또는 날짜 시간)를 원하면 훨씬 쉽습니다.

$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');

이 다른 질문은 같은 주제를 참조하십시오 : 날짜 형식 변환 yyyy-mm-dd => dd-mm-yyyy .


그리고 당신이 언급 한 질문 전에 질문을하면 어떻게 중복됩니까?
Tom

1
응답을 편집했습니다. 이 두 질문이 어떻게 든 연결되어야한다고 지적하고 싶었습니다.
ceiroa

PHP 5.3 이상에서 사용 가능
Zorox

$timestring = $now->format('Y-m-d h:i:s');확실히? m몇 달, i몇 분
Mark Baker


53

기초

한 날짜 형식을 다른 날짜 형식으로 변환하는 간단한 방법은와 strtotime()함께 사용 하는 것 date()입니다. strtotime()날짜를 Unix Timestamp 로 변환합니다 . 그런 다음 해당 Unix Timestamp를 전달 date()하여 새로운 형식으로 변환 할 수 있습니다.

$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);

또는 단일 라이너로 :

$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));

명심 strtotime()날짜를 필요는있을 수 있습니다 올바른 형식 . 유효한 형식을 제공하지 않으면 strtotime()false가 반환되어 날짜가 1969-12-31이됩니다.

사용 DateTime()

PHP 5.2부터 PHP는 DateTime()날짜와 시간으로 작업하기위한보다 강력한 도구를 제공하는 클래스를 제공했습니다. 다음과 같이 사용하여 위 코드를 다시 작성할 수 있습니다 DateTime().

$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');

유닉스 타임 스탬프 작업

date() 유닉스 타임 스탬프를 두 번째 매개 변수로 사용하고 형식화 된 날짜를 반환합니다.

$new_date_format = date('Y-m-d H:i:s', '1234567890');

DateTime ()은 타임 스탬프 @이전 을 추가하여 Unix 타임 스탬프와 함께 작동합니다 .

$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');

시간 소인이 밀리 000초인 경우 (종료 되거나 시간 소인이 13자인 경우) 다른 형식으로 변환하려면 시간을 초로 변환해야합니다. 이를 수행하는 두 가지 방법이 있습니다.

  • 를 사용하여 마지막 세 자리 자르기 substr()

마지막 세 자리를 트리밍하는 방법에는 여러 가지가 있지만 사용하는 substr()것이 가장 쉽습니다.

$timestamp = substr('1234567899000', -3);
  • substr을 1000으로 나눕니다.

또한 타임 스탬프를 1000으로 나누어서 타임 스탬프를 초로 변환 할 수 있습니다. 타임 스탬프가 너무 커서 32 비트 시스템에서 수학을 수행 할 수 없으므로 BCMath 라이브러리를 사용 하여 수학을 문자열로 수행해야합니다.

$timestamp = bcdiv('1234567899000', '1000');

유닉스 타임 스탬프를 얻으려면 유닉스 타임 스탬프 strtotime()를 반환하는 다음을 사용할 수 있습니다 .

$timestamp = strtotime('1973-04-18');

DateTime ()을 사용하면 DateTime::getTimestamp()

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();

PHP 5.2를 실행하는 경우 U대신 포맷 옵션을 사용할 수 있습니다 .

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');

비표준적이고 모호한 날짜 형식으로 작업

불행히도 개발자가 작업해야하는 모든 날짜가 표준 형식 인 것은 아닙니다. 다행스럽게도 PHP 5.3은 이에 대한 해결책을 제공했습니다. DateTime::createFromFormat()PHP가 날짜 문자열의 형식을 알려 주면 나중에 조작 할 수 있도록 DateTime 객체로 구문 분석 할 수 있습니다.

$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');

PHP 5.4에서는 인스턴스화에서 클래스 멤버 액세스를 수행 할 수있는 기능이 추가되어 DateTime()코드를 단일 라이너로 변환 할 수 있습니다 .

$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');

$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');

27

이 시도:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));

작동하지 않습니다. strtotime ()이 형식을 인식하지 못합니다. 방금 시도했습니다.
Pekka

동의, 방금 질문자의 형식 코드를 입력하면 올바른 형식이 지정되어야합니다.
Sarfraz

그것은 나를 위해 일했다. 내 $ old_date는 2012-05-22T19 : 16 : 37 + 01 : 00과 같습니다. 그건 그렇고 감사합니다!
VishwaKumar

15

변환하려면 $date에서 dd-mm-yyyy hh:mm:ss내가 같이 갈 적절한 MySQL의 날짜로 :

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');

4
$ date가 유효한 날짜이고 형식에 맞는지 110 % 확신하지 않는 한 이러한 방법을 연결해서는 안됩니다. 그렇게 말하면 형식과 정확히 일치하지 않는 유효하지 않은 날짜는 다음을 반환 Fatal error: Call to a member function format() on a non-object합니다. 그냥 머리!
Half Crazed

사실, 더 나은 해결책은 중간 단계로 null 검사를 사용하여 3 단계로 수행하는 것입니다.
Jelle de Fries

11

다음은 날짜를 다른 형식으로 변환하는 쉬운 방법입니다.

// Create a new DateTime object
$date = DateTime::createFromFormat('Y-m-d', '2016-03-25');

// Output the date in different formats
echo $date->format('Y-m-d')."\n";
echo $date->format('d-m-Y')."\n";
echo $date->format('m-d-Y')."\n";

10
$old_date = date('y-m-d-h-i-s');       // works

당신은 여기서 잘못하고 있습니다.

$old_date = date('y-m-d h:i:s');       // works

시간의 구분자는 ':'


나는 이것이 도움이 될 것이라고 생각한다 ...

$old_date = date('y-m-d-h-i-s');              // works

preg_match_all('/(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)/', $old_date, $out, PREG_SET_ORDER);
$out = $out[0];
$time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]);

$new_date = date('Y-m-d H:i:s', $time); 

또는


$old_date = date('y-m-d-h-i-s');              // works

$out = explode('-', $old_date);
$time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]);

$new_date = date('Y-m-d H:i:s', $time); 

예, 감사합니다. 올바른 날짜 형식으로 다시 변환하려는 GUID 파일 이름입니다.
Tom

8

이 기본 방식은 입력 된 형식을 원하는 형식으로 변환하는 데 도움이됩니다.

$formatInput = 'd-m-Y'; //Give any format here, this would be converted into your format
$dateInput = '01-02-2018'; //date in above format

$formatOut = 'Y-m-d'; // Your format
$dateOut = DateTime::createFromFormat($formatInput, $dateInput)->format($formatOut);

7

날짜 함수 에는 두 번째 인수로 시간 소인이 필요하므로 $ old_date를 시간 소인으로 다시 변환해야합니다 .


7

strtotime은 그것을 해결할 것입니다. 날짜는 동일하지 않으며 모두 미국 형식입니다.

<?php
$e1 = strtotime("2013-07-22T12:00:03Z");
echo date('y.m.d H:i', $e1);
echo "2013-07-22T12:00:03Z";

$e2 = strtotime("2013-07-23T18:18:15Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-23T18:18:15Z";

$e1 = strtotime("2013-07-21T23:57:04Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-21T23:57:04Z";
?>

5

이 시도:

$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];

5

이것은 나를 위해 해결되었습니다.

$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;

출력 : 2018-04-18


2

이것은 날짜 형식을 변환 할 수있는 다른 방법입니다.

 <?php
$pastDate = "Tuesday 11th October, 2016";
$pastDate = str_replace(",","",$pastDate);

$date = new DateTime($pastDate);
$new_date_format = $date->format('Y-m-d');

echo $new_date_format.' 23:59:59'; ?>

1

문자열을 사용하면 나에게 좋은 솔루션이며 mysql의 문제는 줄어 듭니다. 현재 형식을 감지하고 필요한 경우 변경합니다.이 솔루션은 php datetime 함수를 사용하지 않고 스페인어 / 프랑스어 형식 및 영어 형식에만 해당됩니다.

class dateTranslator {

 public static function translate($date, $lang) {
      $divider = '';

      if (empty($date)){
           return null;   
      }
      if (strpos($date, '-') !== false) {
           $divider = '-';
      } else if (strpos($date, '/') !== false) {
           $divider = '/';
      }
      //spanish format DD/MM/YYYY hh:mm
      if (strcmp($lang, 'es') == 0) {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 4) {
                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '-') == 0) {
                $date = str_replace("-", "/", $date);
           }
      //english format YYYY-MM-DD hh:mm
      } else {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 2) {

                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '/') == 0) {
                $date = str_replace("/", "-", $date);

           }   
      }
      return $date;
 }

 public static function reverseDate($date) {
      $date2 = explode(' ', $date);
      if (count($date2) == 2) {
           $date = implode("-", array_reverse(preg_split("/\D/", $date2[0]))) . ' ' . $date2[1];
      } else {
           $date = implode("-", array_reverse(preg_split("/\D/", $date)));
      }

      return $date;
 }

사용하다

dateTranslator::translate($date, 'en')

1

나는 이것이 오래되었다는 것을 알고 있지만 API에서 5 가지 날짜 형식을 일관되게 사용하는 공급 업체 (및 5에서 최신 7까지 다양한 PHP 버전의 테스트 서버 테스트)를 실행하면서 범용 변환기를 작성하기로 결정했습니다. 수많은 PHP 버전에서 작동합니다.

이 컨버터는 모든 표준 날짜 형식 (또는 밀리없이 포함)을 포함하여 거의 모든 입력을 취할 것입니다 모든 Epoch Time 표현 ( 다른 형식으로 변환합니다.

그것을 호출하려면 :

$TheDateTimeIWant=convertAnyDateTome_toMyDateTime([thedateIhave],[theformatIwant]);

형식으로 널을 보내면 함수가 날짜 시간을 Epoch / Unix Time으로 리턴합니다. 그렇지 않으면, date ()가 지원하는 모든 형식 문자열과 밀리 초 동안 ".u"를 전송하십시오 (date ()가 0을 반환하더라도 밀리 초도 처리 함).

코드는 다음과 같습니다.

        <?php   
        function convertAnyDateTime_toMyDateTime($dttm,$dtFormat)
        {
            if (!isset($dttm))
            {
                return "";
            }
            $timepieces = array();
            if (is_numeric($dttm))
            {
                $rettime=$dttm;
            }
            else
            {
                $rettime=strtotime($dttm);
                if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))>0)
                {
                    $rettime=$rettime.substr($dttm,strpos($dttm,"."),strpos($dttm,"-",strpos($dttm,"."))-strpos($dttm,"."));
                    $timepieces[1]="";
                }
                else if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))==0)
                {               
                    preg_match('/([0-9]+)([^0-9]+)/',substr($dttm,strpos($dttm,"."))." ",$timepieces);
                    $rettime=$rettime.".".$timepieces[1];
                }
            }

            if (isset($dtFormat))
            {
                // RETURN as ANY date format sent
                if (strpos($dtFormat,".u")>0)       // Deal with milliseconds
                {
                    $rettime=date($dtFormat,$rettime);              
                    $rettime=substr($rettime,0,strripos($rettime,".")+1).$timepieces[1];                
                }
                else                                // NO milliseconds wanted
                {
                    $rettime=date($dtFormat,$rettime);
                }
            }
            else
            {
                // RETURN Epoch Time (do nothing, we already built Epoch Time)          
            }
            return $rettime;    
        }
    ?>

다음은 몇 가지 샘플 호출입니다. 위에서 언급했듯이 GMT 이외의 시간은 표준 시간대로 반환되지만 모든 시간대 데이터도 처리합니다.

        $utctime1="2018-10-30T06:10:11.2185007-07:00";
        $utctime2="2018-10-30T06:10:11.2185007";
        $utctime3="2018-10-30T06:10:11.2185007 PDT";
        $utctime4="2018-10-30T13:10:11.2185007Z";
        $utctime5="2018-10-30T13:10:11Z";
        $dttm="10/30/2018 09:10:11 AM EST";

        echo "<pre>";
        echo "<b>Epoch Time to a standard format</b><br>";
        echo "<br>Epoch Tm: 1540905011    to STD DateTime     ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","Y-m-d H:i:s")."<hr>";
        echo "<br>Epoch Tm: 1540905011          to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","c");
        echo "<br>Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011.2185007","c")."<hr>";
        echo "<b>Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)";
        echo "</b><br>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,null);
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,null);
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,null);
        echo "<br>UTCTime4: ".$utctime4."      ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime4,null);
        echo "<br>UTCTime5: ".$utctime5."              ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime5,null);
        echo "<br>NO MILIS: ".$dttm."        ----RESULT: ".convertAnyDateTime_toMyDateTime($dttm,null);
        echo "<hr>";
        echo "<hr>";
        echo "<b>Returned as whatever datetime format one desires</b>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,"Y-m-d H:i:s")."              Y-m-d H:i:s";
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<p><b>Returned as ISO8601</b>";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"c")."        ISO8601";
        echo "</pre>";

출력은 다음과 같습니다.

Epoch Tm: 1540905011                        ----RESULT: 2018-10-30 09:10:11

Epoch Tm: 1540905011          to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)

UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 1540905011.2185007
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 1540894211.2185007
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 1540905011.2185007
UTCTime4: 2018-10-30T13:10:11.2185007Z      ----RESULT: 1540905011.2185007
UTCTime5: 2018-10-30T13:10:11Z              ----RESULT: 1540905011
NO MILIS: 10/30/2018 09:10:11 AM EST        ----RESULT: 1540908611
Returned as whatever datetime format one desires
UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 2018-10-30 09:10:11              Y-m-d H:i:s
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 2018-10-30 06:10:11.2185007      Y-m-d H:i:s.u
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30 09:10:11.2185007      Y-m-d H:i:s.u
Returned as ISO8601
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30T09:10:11-04:00        ISO8601

이 버전에없는 유일한 것은 반환 된 날짜 / 시간을 입력 할 시간대를 선택할 수있는 기능입니다. 원래는 날짜 / 시간을 Epoch Time으로 변경하기 위해 작성 했으므로 시간대 지원이 필요하지 않았습니다. 추가하는 것은 사소한 일입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.