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

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

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



답변

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

$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 형식이 가정됩니다.


답변

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);


답변

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

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);

}


답변

STRTOTIME 기록에서 참고 :

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

그렇게 간단합니다.


답변

아마도 가장 빠를 것입니다

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

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


답변

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

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

class Date {

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

    }

}

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


답변

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));

효과가 있었다!