Strtotime ()이 dd / mm / YYYY 형식에서 작동하지 않습니다


167

나는 그 strtotime()기능을 정말 좋아 하지만 사용자 매뉴얼은 지원되는 날짜 형식에 대한 완전한 설명을 제공하지 않습니다. strtotime('dd/mm/YYYY')작동하지 않으며 mm/dd/YYYY형식으로 만 작동 합니다.

날짜 dd/mm/YYYY형식 이있는 경우 날짜를 어떻게 변환 할 수 YYYY-mm-dd있습니까? 나는 explode()기능 을 사용하여 그것을 할 수 있지만 더 나은 해결책이 있다고 생각합니다.


7
실제로 파싱하기 위해 "YYYY-mm-dd"형식으로 변환 할 필요는 없습니다. – "dd-mm-YYYY"로 변경하면됩니다.str_replace('/', '-', $date);
Gavin Coates

답변:


399

간단한 해결책은 다음과 같습니다.

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

결과:

2010-05-25

strtotime설명서를

m / d / y 또는 dmy 형식의 날짜 는 다양한 구성 요소 사이의 구분 기호를 보면 명확 해집니다. 구분 기호가 슬래시 ( / )이면 미국의 m / d / y 가 가정됩니다. 반면 구분 기호가 대시 ( - ) 또는 점 ( . )이면 유럽 dmy 형식이 가정됩니다.


2
@Web Logic strtotimr ('01 -01-2010 ')를 쓰면 strtotime () 함수의 기본 형식을 견딜 수 없습니다 .dd-mm-YYYY 또는 mm-dd-YYYY 형식으로 이해합니까?
Simon

3
다음과 같이 테스트하면 echo date('Y-m-l', strtotime('01-01-2010'));결과는 2010-01-Friday입니다. 따라서 하루가 끝나는 시점은 date함수에 날짜 형식을 지정하는 방법에 따라 다릅니다 .

1
여기에 게시 한 내용이 정확하고 사용자의 질문에 답변하지만 실제 문제를 해결하는 방법입니다. strtotime ()이 "dd / mm / yy"형식으로 날짜를 올바르게 구문 분석하려면 "/"를 "-"로 바꿔야합니다. 따라서 답의 처음 두 줄만 $date = '25/05/2010'; $date = str_replace('/', '-', $date); 필요합니다. 문제를 해결하기 위해 추가 줄이 필요하지 않습니다.
Gavin Coates 2014

하루가> 12 인 경우에만 정확합니다. $ date = '1 / 2 / 34'; // 2034 년 2 월 1 일 echo date ( 'd M Y', strtotime ($ date)); // 2034년 1월 2일
kurdtpage

고마워 친구 정말 내 하루를 만들었습니다.
BEingprabhU

64

DateTime :: createFromFormat을 사용 하여 (PHP 5.3부터) 사용자 정의 형식의 날짜를 구문 분석 할 수 있습니다

$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();

(외부 : !은 지정되지 않은 값을 유닉스 타임 스탬프로 재설정하는 데 사용됩니다. 즉, 시간은 자정입니다.)


PHP 5.3을 사용하지 않거나 사용하지 않으려면 strtotime이 사용할 수있는 사용 가능한 날짜 / 시간 형식의 전체 목록이 날짜 형식 매뉴얼 페이지 에 나열되어 있습니다. 해당 페이지는 더 철저하게 사실을 설명 m/d/Y을 통해 추정된다 d/m/Y(그러나 당신이 할 수있는, 여기에 대한 답변에서 언급 한 바와 같이, 사용 d-m-Y, d.m.Y또는 d\tm\tY).


과거 str_replace에는 날짜 문자열을 다른 형식으로 자체 구문 분석 할뿐만 아니라 다른 답변에 언급 된 빠른 방법을 사용했습니다.

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);

17

이것은 많은 문제에 대한 좋은 해결책입니다.

function datetotime ($date, $format = 'YYYY-MM-DD') {

    if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
    if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
    if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);

    if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
    if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
    if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);

    if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
    if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
    if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);

    return mktime(0, 0, 0, $month, $day, $year);

}

16

STRTOTIME 기록에서 참고 :

m / d / y 또는 dmy 형식의 날짜는 다양한 구성 요소 사이의 구분 기호를 보면 명확 해집니다. 구분 기호가 슬래시 (/)이면 미국식 m / d / y로 가정됩니다. 반면 구분 기호가 대시 (-) 또는 점 (.)이면 유럽 dmy 형식이 가정됩니다.

그렇게 간단합니다.


오류가 발생하지 않지만 확인 $t하고 $t1다른 결과를 표시 할 때 구현할 수 있습니다. 나는 이렇게 확인했다. $t=strtotime(date('d-m-Y'));$t1=strtotime(date('m/d/Y'));
vusan

3

아마도 가장 빠를 것입니다

false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date))

형식이 올바른 형식이 아닌 경우 false를 반환하지만 날짜가 유효한지 확인하지 않습니다.


2

더 나은 해결책을 찾지 못했습니다. 을 사용할 수 있습니다 explode().preg_match_all()

이런 정적 도우미 기능이 있습니다

class Date {

    public static function ausStrToTime($str) {
        $dateTokens = explode('/', $str);
        return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); 

    }

}

아마도 더 좋은 이름이있을 것입니다.하지만 ausStrToTime()호주 날짜 (호주 호주 인이기 때문에 종종 다루는 날짜)와 작동 하기 때문에 사용 합니다. 더 나은 이름은 아마도 표준화 된 이름 일 것입니다. 그러나 그것이 무엇인지 잘 모르겠습니다.


2

ddmmyy 형식을 date("Y-m-d"형식 으로 변환하려고했지만 직접 전달하면 작동하지 않았습니다.ddmmyy =date('dmy')

그런 다음 yyyy-mm-dd 형식이어야 함을 깨달았습니다. 부분 문자열을 사용하여 구성

$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);  

그런 다음에 전달 date("Y-m-d",strtotime($strParam));

효과가 있었다!


2

$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');

이것은 당신을 위해 일할 것입니다. 문자열을 사용자 정의 날짜 형식으로 변환하여 문자열의 원래 형식을 PHP에 지정할 수 있습니다. 이제 날짜 형식이므로 PHP의 기본 날짜 형식으로 변환 할 수 있는데, 이는 MySQL에서 사용하는 것과 동일합니다.


깨끗한과 최고의 솔루션
마르코 마르 살라

1

데이터베이스에서이 값을 얻습니까? 그렇다면 데이터베이스에서 형식을 지정하십시오 ( date_format예 : mysql에서 사용 ). 그렇지 않은 경우 strtotime은 dd / mm / yyyy 값을 인식하지 못하기 때문에 값을 분해하는 것이 가장 좋습니다.


1

dd / mm / YYYY에 있다는 것을 알고 있다면 다음을 수행 할 수 있습니다.

    $regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#';
    $match = array();
    if (preg_match($regex, $date, $match)) {
        if (strlen($match[3]) == 2) {
            $match[3] = '20' . $match[3];
        }
        return mktime(0, 0, 0, $match[2], $match[1], $match[3]);
    }
    return strtotime($date);

d / m / YY 또는 dd / mm / YYYY (또는 둘의 조합) 형식의 날짜와 일치합니다.

/보다 많은 구분 기호를 지원하려면 정규식을 다음과 같이 변경할 수 있습니다.

    $regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#';

그런 다음 [/-]비트에 원하는 문자를 추가하십시오 (참고 :-문자는 마지막 문자 여야 함).


확실히 당신의 정규식 사용해야 \d진수에 대한보다는 [/d]위한 슬래시 또는 d 문자 .
salathe

1

이 해결 방법은 폭발보다 간단하고 우아합니다.

$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);

날짜가 어떤 형식인지 알 필요는 없지만 슬래시가 있으면 완전히 정지로 바뀌고 strtotime에 의해 유럽으로 처리됩니다.


0

가장 간단한 해결책은 다음과 같습니다.

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));

3
이것은 잘못이다. 질문은 명시 적으로 dd / mm / yyyy 입력과 관련이 있습니다.
매트 플레처

0

이것은 앞에 0이있는 경우에도 사용중인 솔루션입니다.

<?php
 $date = '05/05/2017';
 $date = str_replace('/', '-', $date);
 $date = date('Y-m-d', strtotime($date));

 echo $date;
?>

0

$ date_info = '20 / 02 / 2019 '; 에코 날짜 ( 'Ym-d', strtotime (str_replace ( '/', '-', $ date_info)));


0

이처럼 간단

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.