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?

matthy
fonte
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 :-)

richsage
fonte
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
?>
ceiroa
fonte
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.

Tim Lytle
fonte
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.

Alper Sarı
fonte
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));
Kevin
fonte
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 :)

Gabriel
fonte
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
Igor Donin
fonte
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');
Raja Ram T
fonte
9

Você pode tentar a strftime()função. Exemplo simples:strftime($time, '%d %m %Y');

Sinan
fonte
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);
}
Juancho Ramone
fonte
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);
Vishnu
fonte
5
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));
AbdulBasit
fonte
1
Para o Mysql, o formato da data é Ymd como "2014-04-26"
AbdulBasit 28/04
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).

Varun PV
fonte
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.

Não entre em pânico
fonte
Como converter 2019-10-28T17: 02: 49Z para timestamp?
Bogdan Bogdanov
1
Use strtotime(). :-)
Não entre em pânico
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
André Rodrigues
fonte
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));
Sani Kamal
fonte
0

Use date_createedate_format

Tente isso.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Quatban Taco
fonte