Converter um formato de data em PHP


489

Estou tentando converter uma data de yyyy-mm-ddpara dd-mm-yyyy(mas não no SQL); no entanto, não sei como a função date exige um carimbo de data / hora e não consigo obter um carimbo de data / hora dessa string.

Como isso é possível?


21
dd-mm-aaaa é o formato padrão (na maior parte) da Europa, pelo menos quando você precisa apresentar dados aos usuários.
— Matteo Riva

7
dd-mm-aaaa na Austrália e Nova Zelândia também
— Jonathan dia

2
mm-dd-aaaa nos EUA. @stesch: o primeiro é padrão no SQL. Não tenho certeza de que seja padrão em nenhum país. :)
— Herbert

10
Na verdade, o padrão é aaaa-mm-dd, de acordo com a ISO 8601 .
— precisa

7
O "Padrão" global é aaaa-mm-dd e sempre deve ser usado pelos sistemas sempre que possível. O dia da encomenda, mês, ano é usado por pessoas na maior parte do mundo (exceto EUA), mas geralmente com barras, não hífens. Para evitar confusão, eu separo apenas AAAA-MM-DD com hífens. Qualquer outro formato de data separarei com barras. Isso mantém as coisas consistentes.
— rjmunro

Respostas:


1056

Use strtotime()e date():

$originalDate = "2010-03-21";
$newDate = date("d-m-Y", strtotime($originalDate));

(Veja a documentação sobre strtotime e date no site PHP.)

Observe que essa foi uma solução rápida para a pergunta original. Para conversões mais extensas, você realmente deve usar a DateTimeclasse para analisar e formatar :-)


14
E se eu receber essa data 0000-00-00 no mySQL? ele retorna uma data errada como 31/12/1969 ...
— Enrique

3
@Enrique: Se você obtém 000-00-00 do MySQL, deve testar esse PRIMEIRO antes de colocá-lo na conversão. Simples.
— ShadowStorm 4/11/2012

1
@SobinAugustine et al: strtotime () converterão a string de data em um "carimbo de data / hora do Unix (o número de segundos desde 1 de janeiro de 1970 00:00:00 UTC)", uma data de formato () pode entender e depois converter. Portanto, isso não funcionará com um timestamp antes de 1970.
— Samuel Lindblom

1
@SamuelLindblom não, não é assim, ele funcionará antes de 1970.
— Sobin Augustine

1
@SobinAugustine: Você está certo. No entanto, ele não funcionará antes de 1901-12-14, de modo que ainda se aplica ao motivo pelo qual as datas listadas acima não funcionam.
— Samuel Lindblom

271

Se você deseja evitar a conversão do strtotime (por exemplo, o strtotime não pode analisar sua entrada), você pode usar,

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

Ou equivalente:

$newDateString = date_format(date_create_from_format('Y-m-d', $dateString), 'd-m-Y');

Você está dando primeiro a ele o formato $ dateString. Depois, você está dizendo o formato em que deseja que $ newDateString esteja.

Ou se o formato de origem sempre for "Ymd" (aaaa-mm-dd), use apenas DateTime :

<?php
    $source = '2012-07-31';
    $date = new DateTime($source);
    echo $date->format('d.m.Y'); // 31.07.2012
    echo $date->format('d-m-Y'); // 31-07-2012
?>

17
Obrigado pelo DateTime::createFromFormat()- é realmente mais útil questrtotime()
— Gtx

2
Nota: é necessário o PHP 5.3 ou superior para os dois primeiros métodos.
— Salman von Abbas

Obrigado pela nova opção DateTime. Isso funcionou e foi uma opção muito limpa.
— Nina Morena

1
strtotime()útil para converter o formato de tipo verdadeiro (Ymd) para outros formatos, mas DateTime::createFromFormat()é universal. É como STR_TO_DATEno MySQL
— Taron Saribekyan

Este apenas realmente funcionou para mim em vez de Bullshitstrtotime()
— Código Fogão

72

Usar:

implode('-', array_reverse(explode('-', $date)));

Sem a sobrecarga de conversão de datas, não tenho certeza se isso importará muito.


Sim, respondeu como você enviou o seu, eu acredito. Obviamente, a verificação de erros encontrada no strtotime pode ser útil.
— Tim Lytle

2
Foi útil para mim na conversão de formato de data não-americano ... dd-mm-aaaa => AAAA-MM-DD Veja php.net/manual/en/datetime.formats.date.php
— Chris Jacob

5
Não entenda por que essa resposta tem menos votos. Deve ser a melhor resposta votada. Ele resolve o problema de maneira simples e rápida, sem problemas. Obrigado
— Naeem Ul Wahhab 31 /

2
Você pode até chamá-lo novamente se precisar reverter o formato da data para sua forma original. Melhor resposta, de fato. :)
— Pedro Araujo Jorge /

1
isso deve ser alterado como resposta aceita, resolve todos os problemas de data e hora do uso de formatos de data e data.
— Matteo Bononi 'peorthyr'

38
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);

Este código funciona para todos os formatos de data.

Você pode alterar a ordem das variáveis ​​de substituição, como $ 3- $ 1- $ 2, devido ao seu antigo formato de data.


Muito obrigado!
— Lê Văn Chiến

28
$timestamp = strtotime(your date variable); 
$new_date = date('d-m-Y', $timestamp);

Para mais, consulte a documentação parastrtotime .

Ou ainda mais curto:

$new_date = date('d-m-Y', strtotime(your date variable));

27

Também outra possibilidade obscura:

$oldDate = '2010-03-20'
$arr = explode('-', $oldDate);
$newDate = $arr[2].'-'.$arr[1].'-'.$arr[0];

Eu não sei se eu iria usá-lo, mas ainda :)


1
Acabei usando isso porque, em nosso aplicativo, as pessoas digitariam "99" se um dos campos (dia, mês, ano) for desconhecido. Boa abordagem se você tiver datas "falsas" em seus dados.
— Voodoo

18

Nota : Como a resposta desta postagem às vezes é votada, voltei aqui para pedir às pessoas para não votarem mais. Minha resposta é antiga, não tecnicamente correta, e há várias abordagens melhores aqui. Só estou mantendo aqui para fins históricos.

Embora a documentação descreva mal a função strtotime, @rjmunro abordou corretamente o problema em seu comentário: está na data no formato ISO "AAAA-MM-DD".

Além disso, mesmo que minha função Date_Converter ainda funcione, gostaria de avisar que pode haver declarações imprecisas abaixo, portanto, desconsidere-as.

A resposta mais votada está realmente incorreta!

O manual do PHP strtotime aqui afirma que "A função espera receber uma string contendo um formato de data em inglês". O que realmente significa é que espera um formato de data americano nos EUA, como "mdY" ou "m / d / Y".

Isso significa que uma data fornecida como "Ymd" pode ser mal interpretada strtotime. Você deve fornecer a data no formato esperado.

Eu escrevi uma pequena função para retornar datas em vários formatos. Use e modifique à vontade. Se alguém transformar isso em classe, ficaria feliz em compartilhar isso.

function Date_Converter($date, $locale = "br") {

    # Exception
    if (is_null($date))
        $date = date("m/d/Y H:i:s");

    # Let's go ahead and get a string date in case we've
    # been given a Unix Time Stamp
    if ($locale == "unix")
        $date = date("m/d/Y H:i:s", $date);

    # Separate Date from Time
    $date = explode(" ", $date);

    if ($locale == "br") {
        # Separate d/m/Y from Date
        $date[0] = explode("/", $date[0]);
        # Rearrange Date into m/d/Y
        $date[0] = $date[0][1] . "/" . $date[0][0] . "/" . $date[0][2];
    }

    # Return date in all formats
        # US
        $Return["datetime"]["us"] = implode(" ", $date);
        $Return["date"]["us"]     = $date[0];

        # Universal
        $Return["time"]           = $date[1];
        $Return["unix_datetime"]  = strtotime($Return["datetime"]["us"]);
        $Return["unix_date"]      = strtotime($Return["date"]["us"]);
        $Return["getdate"]        = getdate($Return["unix_datetime"]);

        # BR
        $Return["datetime"]["br"] = date("d/m/Y H:i:s", $Return["unix_datetime"]);
        $Return["date"]["br"]     = date("d/m/Y", $Return["unix_date"]);

    # Return
    return $Return;

} # End Function

2
Lendo, eu gosto do Ceiroa. É muito mais fácil do que explodir / implodir a data.
— Igor Donin 07/08/2012

3
A resposta superior não está incorreta. O PHP faz a coisa certa com uma data no formato ISO "AAAA-MM-DD". Ele não pode interpretar mal como uma data nos EUA, porque possui 4 dígitos no início e usa - não / como separador. As datas ISO foram cuidadosamente projetadas para não serem confundidas com outros formatos.
— Rjmunro 4/03

14

Existem duas maneiras de implementar isso:

1

    $date = strtotime(date);
    $new_date = date('d-m-Y', $date);

2)

    $cls_date = new DateTime($date);
    echo $cls_date->format('d-m-Y');


8

Use esta função para converter de qualquer formato para qualquer formato

function reformatDate($date, $from_format = 'd/m/Y', $to_format = 'Y-m-d') {
    $date_aux = date_create_from_format($from_format, $date);
    return date_format($date_aux,$to_format);
}

7

Dado a seguir, está o código PHP para gerar a data de amanhã usando mktime()e altere seu formato para formato dd / mm / aaaa e imprima-o usando echo.

$tomorrow = mktime(0, 0, 0, date("m"), date("d") + 1, date("Y"));
echo date("d", $tomorrow) . "/" . date("m", $tomorrow). "/" . date("Y", $tomorrow);


2

Você pode alterar o formato usando a data () e o horário ().

$ date = '18/09/2019';

data do eco ('dm-y', strtotime ($ date));

Resultado:

18-09-19

Podemos mudar o formato alterando o (dmy).


1

Para essa conversão específica, também podemos usar uma string de formato.

$new = vsprintf('%3$s-%2$s-%1$s', explode('-', $old));

Obviamente, isso não funcionará para muitas outras conversões de formato de data, mas como estamos reorganizando as substrings nesse caso, essa é outra maneira possível de fazer isso.


Como converter 2019-10-28T17: 02: 49Z para timestamp?
— Bogdan Bogdanov


1
    function dateFormat($date) {
        $m = preg_replace('/[^0-9]/', '', $date);
        if (preg_match_all('/\d{2}+/', $m, $r)) {
        $r = reset($r);
            if ($r[2] <= 12 && $r[3] <= 31) return "$r[0]$r[1]-$r[2]-$r[3]";// Y-m-d
            if ($r[0] <= 31 && $r[1] != 0 && $r[1] <= 12) return "$r[2]$r[3]-$r[1]-$r[0]";// d-m-Y
            if ($r[0] <= 12 && $r[1] <= 31) return "$r[2]$r[3]-$r[0]-$r[1]";// m-d-Y
            if ($r[2] <= 31 && $r[3] <= 12) return "$r[0]$r[1]-$r[3]-$r[2]";//Y-m-d
        }
    }

var_dump(dateFormat('31/01/2000')); // return 2000-01-31
var_dump(dateFormat('01-31-2000')); // return 2000-01-31
var_dump(dateFormat('2000-31-01')); // return 2000-01-31
var_dump(dateFormat('20003101')); // return 2000-01-31

0

Maneira simples Use strtotime()e date():

$original_dateTime = "2019-05-11 17:02:07"; #This may be database datetime
$newDate = date("d-m-Y", strtotime($original_dateTime));

Com tempo

$newDate = date("d-m-Y h:i:s a", strtotime($original_dateTime));

0

Use date_createedate_format

Tente isso.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.