Strtotime () não funciona no formato dd / mm / AAAA

167

Gosto muito da strtotime()função, mas o manual do usuário não fornece uma descrição completa dos formatos de data suportados. strtotime('dd/mm/YYYY')não funciona, funciona apenas com o mm/dd/YYYYformato.

Se eu tiver data no dd/mm/YYYYformato, como posso convertê-la para YYYY-mm-dd? Eu posso fazer isso usando a explode()função, mas acho que existem soluções melhores.

Simon
fonte
7
Você realmente não precisa convertê-lo para o formato "AAAA-MM-DD" para analisá-lo - você só precisa mudar para "dd-mm-AAAA", o que pode ser feito comstr_replace('/', '-', $date);
Gavin Coates

Respostas:

399

Aqui está a solução simplificada:

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

Resultado:

2010-05-25

A strtotimedocumentação diz:

As datas nos formatos m / d / a ou dmy são desambiguadas observando o separador entre os vários componentes: se o separador é uma barra ( / ), então o m / d / a americano é assumido; enquanto que se o separador for um hífen ( - ) ou um ponto ( . ), o formato dmy europeu é assumido.

TRiG
fonte
2
@Web Logic Não consigo entender o formato padrão da função strtotime (), se eu escrever strtotimr ('01 -01-2010 '), ele entenderá no formato dd-mm-YYYY ou mm-dd-YYYY?
Simon
3
Se você testá-lo com: echo date('Y-m-l', strtotime('01-01-2010'));O resultado é 2010-01-Friday. Portanto, o dia que chega ao final depende de como você especifica o formato da data para a datefunção.
1
Embora o que você postou aqui esteja correto e responda à pergunta dos usuários - é uma maneira indireta de resolver o problema real. Para que o strtotime () analise adequadamente uma data no formato "dd / mm / aa", é necessário substituir o "/" por "-". Portanto, você realmente precisa apenas das duas primeiras linhas da resposta: $date = '25/05/2010'; $date = str_replace('/', '-', $date); A linha adicional não é necessária para resolver o seu problema.
Gavin Coates
Isso só está correto se o dia for> 12: $ date = '1/2/34'; // data de eco de 1º de fevereiro de 2034 ('d MY', strtotime ($ date)); // 02 Jan 2034
kurdtpage 28/08
Obrigado, companheiro. Realmente fez o meu dia.
precisa saber é o seguinte
64

Você pode analisar datas de um formato personalizado (a partir do PHP 5.3) com DateTime :: createFromFormat

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

(Além disso: !é usado para redefinir valores não especificados para o registro de data e hora do Unix, ou seja, o horário será meia-noite.)


Se você não deseja (ou não pode) usar o PHP 5.3, uma lista completa dos formatos de data / hora disponíveis aceitos pelo strtotime está listada na página de manual Formatos de data . Essa página descreve mais profundamente o fato de que m/d/Yé inferida ao longo d/m/Y(mas você pode, como mencionado nas respostas aqui, uso d-m-Y, d.m.You d\tm\tY).


No passado, eu também recorri ao quicky str_replacemencionado em outra resposta, além de analisar automaticamente a sequência de datas em outro formato como

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

Esta é uma boa solução para muitos problemas:

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

}
Jonathan Roy
fonte
16

Na gravação STRTOTIME Nota:

As datas nos formatos m / d / a ou dmy são desambiguadas observando o separador entre os vários componentes: se o separador é uma barra (/), então o m / d / a americano é assumido; enquanto que se o separador for um hífen (-) ou um ponto (.), o formato dmy europeu é assumido.

É tão simples quanto isso.

L. Smit
fonte
Podemos implementar isso porque eles não dão erro, mas quando eu verifiquei $te estou $t1mostrando resultados diferentes. Eu verifiquei assim. $t=strtotime(date('d-m-Y'));e $t1=strtotime(date('m/d/Y'));
vusan 10/10/12
3

mais rápido provavelmente deve ser

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

isso retornará false se o formato não se parecer com o correto, mas não verificará se a data é válida

skullnobrains
fonte
2

Não encontrei uma solução melhor. Você pode usar explode(), preg_match_all()etc.

Eu tenho uma função auxiliar estática como esta

class Date {

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

    }

}

Provavelmente existe um nome melhor para isso, mas uso ausStrToTime()porque funciona com datas australianas (com as quais costumo lidar, sendo australiana). Um nome melhor provavelmente seria o nome padronizado, mas não tenho certeza do que seja.

alex
fonte
2

Tentei converter o formato ddmmyy para o date("Y-m-d"formato, mas não estava funcionando quando passo diretamenteddmmyy =date('dmy')

então percebi que deveria estar no formato aaaa-mm-dd. substring usado para organizar

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

depois passou para date("Y-m-d",strtotime($strParam));

funcionou!

smakintel.com
fonte
2

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

Isso funcionará para você. Você converte a String em um formato de data personalizado, onde pode especificar para o PHP qual o formato original da String que foi fornecido a ela. Agora que é um formato de data, você pode convertê-lo no formato de data padrão do PHP, que é o mesmo usado pelo MySQL.

Fi Horan
fonte
solução mais limpa e melhor
Marco Marsala
1

Você está obtendo esse valor de um banco de dados? Nesse caso, considere formatá-lo no banco de dados (use date_formatno mysql, por exemplo). Caso contrário, explodir o valor pode ser a melhor aposta, pois o strtotime simplesmente não parece apreciar os valores dd / mm / aaaa.

Joseph Mastey
fonte
1

Se você souber que está em dd / mm / AAAA, você pode:

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

Ele corresponderá às datas no formato d / m / AA ou dd / mm / AAAA (ou qualquer combinação dos dois) ...

Se você deseja oferecer suporte a mais separadores do que apenas /, altere a regex para:

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

E, em seguida, adicione os caracteres desejados ao [/-]bit (observe que o caractere - precisa ser o último)

ircmaxell
fonte
Certamente seu regex deve estar usando \dpara dígitos decimais em vez de [/d]para a frente-slash ou personagem d .
Salathe 23/05/10
1

Esta solução alternativa é mais simples e elegante do que explodir:

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

Você não precisa saber em que formato está obtendo a data, mas, se houver barras, elas serão substituídas por pontos finais e serão tratadas como européias por hora do strtotime.

user2623027
fonte
0

A solução mais simples é esta:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));
simply_jhen
fonte
3
Isto está errado. A questão está explicitamente relacionada às entradas dd / mm / aaaa.
Matt Fletcher
0

Esta é a solução que estou usando, mesmo que o zero inicial esteja lá.

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

 echo $date;
?>
Nandhini
fonte
0

$ date_info = '20 / 02/2019 '; data do eco ('Ym-d', strtotime (str_replace ('/', '-', $ date_info)));

nazmulhaqued
fonte
0

Simples como este

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
Prajwol KC
fonte