Convertir un formato de fecha en PHP


489

Estoy tratando de convertir una fecha de yyyy-mm-dda dd-mm-yyyy(pero no en SQL); sin embargo, no sé cómo la función de fecha requiere una marca de tiempo, y no puedo obtener una marca de tiempo de esta cadena.

¿Cómo es esto posible?


22
dd-mm-aaaa es el formato estándar en (la mayoría de) Europa al menos cuando necesita presentar datos a los usuarios.
Matteo Riva

77
dd-mm-aaaa en Australia y Nueva Zelanda también
Jonathan Day

2
mm-dd-aaaa en EE. UU. @stesch: el primero es estándar en SQL. No estoy seguro de que sea estándar en ningún país. :)
Herbert

11
En realidad, el estándar es aaaa-mm-dd según ISO 8601 .
Jezen Thomas

77
El "estándar" global es aaaa-mm-dd, y siempre debe ser utilizado por los sistemas siempre que sea posible. El día del pedido, mes, año es utilizado por personas en la mayor parte del mundo (excepto EE. UU.), Pero generalmente con barras, no guiones. Para evitar confusiones, solo separo AAAA-MM-DD con guiones. Cualquier otro formato de fecha lo separaré con barras. Esto mantiene las cosas consistentes.
rjmunro

Respuestas:


1057

Uso strtotime()y date():

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

(Consulte la documentación de tiempo de ejecución y fecha en el sitio PHP).

Tenga en cuenta que esta fue una solución rápida a la pregunta original. Para conversiones más extensas, realmente debería usar la DateTimeclase para analizar y formatear :-)


14
¿Qué sucede si obtengo esta fecha 0000-00-00 de mySQL? devuelve una fecha incorrecta como 31/12/1969 ...
Enrique

3
@Enrique: Si obtiene 000-00-00 de MySQL, debe probarlo PRIMERO antes de realizar la conversión. Simples
ShadowStorm el

1
@SobinAugustine et al: strtotime () convertirá la cadena de fecha en una "marca de tiempo Unix (el número de segundos desde el 1 de enero de 1970 00:00:00 UTC)", una fecha de formato () puede comprender y luego convertir. Así que esto no funcionará con una marca de tiempo anterior a 1970.
Samuel Lindblom

1
@SamuelLindblom no, no es así, funcionará antes de 1970.
Sobin Augustine

1
@SobinAugustine: Tienes razón. Sin embargo, no funcionará antes de 1901-12-14, por lo que todavía se aplica a por qué las fechas mencionadas anteriormente no funcionan.
Samuel Lindblom

272

Si desea evitar la conversión de tiempo de trabajo (por ejemplo, tiempo de trabajo no puede analizar su entrada), puede usar,

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

O equivalente:

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

Primero le está dando el formato en el que está $ dateString. Luego le está diciendo el formato en el que desea que esté $ newDateString.

O si el formato fuente siempre es "Ymd" (aaaa-mm-dd), simplemente use 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
Gracias por el DateTime::createFromFormat()- es realmente más útil questrtotime()
Gtx

2
NB: PHP 5.3+ requerido para los dos primeros métodos.
Salman von Abbas

Gracias por la nueva opción DateTime. Eso funcionó y fue una opción muy limpia.
Nina Morena

1
strtotime()útil para convertir el formato de tipo verdadero (Ymd) a otros formatos, pero DateTime::createFromFormat()es universal. Es como STR_TO_DATEen MySQL
Taron Saribekyan el

Este realmente funcionó para mí En lugar de mentirasstrtotime()
Code Cooker

72

Utilizar:

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

Sin la sobrecarga de conversión de fechas, no estoy seguro de que importe mucho.


Sí, respondí cuando enviaste el tuyo, creo. Por supuesto, la comprobación de errores que se encuentra en tiempo de ejecución puede ser algo útil.
Tim Lytle

2
Fue útil para mí al convertir el formato de fecha no estadounidense ... dd-mm-aaaa => aaaa-mm-dd Ver php.net/manual/en/datetime.formats.date.php
Chris Jacob

55
No entiendo por qué esta respuesta tiene menos votos. Debe ser la respuesta más votada. Resuelve el problema de manera simple y rápida sin ningún problema. Gracias
Naeem Ul Wahhab

2
Incluso puede volver a llamarlo si necesita revertir el formato de fecha a su forma original. La mejor respuesta de hecho. :)
Pedro Araujo Jorge

1
esto debe cambiarse como respuesta aceptada, resuelve todos los problemas de fecha y hora de usar formatos de fecha y fecha.
Matteo Bononi 'peorthyr'

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

Este código funciona para todos los formatos de fecha.

Puede cambiar el orden de las variables de reemplazo como $ 3- $ 1- $ 2 debido a su antiguo formato de fecha.


Muchas gracias!
Lê Văn Chiến

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

Para más información, consulte la documentación destrtotime .

O incluso más corto:

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

27

También otra posibilidad oscura:

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

No sé si lo usaría pero aún así :)


1
Terminé usando esto porque en nuestra aplicación, las personas ingresarían "99" si uno de los campos (día, mes, año) es desconocido. Buen enfoque si tiene alguna fecha "falsa" en sus datos.
Vudú

18

Nota : Debido a que la respuesta de esta publicación a veces recibe un voto positivo, regresé aquí para pedir amablemente a la gente que ya no la votara. Mi respuesta es antigua, no técnicamente correcta, y hay varios enfoques mejores aquí. Solo lo guardo aquí para fines históricos.

Aunque la documentación describe poco la función strtotime, @rjmunro abordó correctamente el problema en su comentario: está en formato ISO fecha "AAAA-MM-DD".

Además, aunque mi función Date_Converter podría seguir funcionando, me gustaría advertir que puede haber declaraciones imprecisas a continuación, así que no las tenga en cuenta.

¡La respuesta más votada es realmente incorrecta!

El manual de tiempo de ejecución de PHP aquí establece que "la función espera recibir una cadena que contenga un formato de fecha en inglés". Lo que realmente significa es que espera un formato de fecha estadounidense en los Estados Unidos, como "mdY" o "m / d / Y".

Eso significa que una fecha proporcionada como "Ymd" puede ser mal interpretada por strtotime. Debe proporcionar la fecha en el formato esperado.

Escribí una pequeña función para devolver fechas en varios formatos. Usar y modificar a voluntad. Si alguien convierte eso en una clase, me alegraría si eso se compartiera.

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
Leyendo, me gusta que Ceiroa lo arregle. Eso es mucho más fácil que explotar / implosionar la fecha.
Igor Donin

3
La respuesta principal no es incorrecta. PHP hace lo correcto con una fecha de formato ISO "AAAA-MM-DD". No puede malinterpretarlo como una fecha de EE. UU., Ya que tiene 4 dígitos al comienzo y usa - no / como separador. Las fechas ISO fueron cuidadosamente diseñadas para no ser confundibles con otros formatos.
rjmunro

14

Hay dos formas de implementar esto:

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 función para convertir de cualquier formato a cualquier 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

A continuación se muestra el código PHP para generar la fecha de mañana usando mktime()y cambiar su formato a dd / mm / aaaa y luego imprimirlo usando echo.

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

5
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));

1
Para Mysql, el formato de fecha es Ymd como "2014-04-26"
AbdulBasit

2

Puede cambiar el formato usando date () y strtotime ().

$ date = '18/09/2019';

echo date ('dm-y', strtotime ($ date));

Resultado:

18-09-19

Podemos cambiar el formato cambiando el (dmy).


1

Para esta conversión específica también podemos usar una cadena de formato.

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

Obviamente, esto no funcionará para muchas otras conversiones de formato de fecha, pero dado que solo estamos reorganizando las subcadenas en este caso, esta es otra forma posible de hacerlo.


¿Cómo convertir 2019-10-28T17: 02: 49Z a la marca de tiempo?
Bogdan Bogdanov

1
Uso strtotime(). :-)
No

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

Manera simple Uso strtotime()y date():

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

Con tiempo

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

0

Uso date_createydate_format

Prueba esto.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.