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?

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

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

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

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

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

Puedes probar la strftime()función. Ejemplo simple:strftime($time, '%d %m %Y');

Sinan
fuente
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);
}
Juancho Ramone
fuente
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);
Vishnu
fuente
5
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));
AbdulBasit
fuente
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).

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

No se asuste
fuente
¿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
André Rodrigues
fuente
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));
Sani Kamal
fuente
0

Uso date_createydate_format

Prueba esto.

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