Foros del Web » Programando para Internet » PHP »

formato de fechas

Estas en el tema de formato de fechas en el foro de PHP en Foros del Web. Hola a todos, Tengo una fecha con este formato en un campo:2/3/2012 y necesitaría transformarla a 20120302 ¿cómo sugerís hacerlo? Gracias por adelantado...
  #1 (permalink)  
Antiguo 15/03/2012, 12:05
 
Fecha de Ingreso: diciembre-2003
Mensajes: 462
Antigüedad: 16 años
Puntos: 5
formato de fechas

Hola a todos,
Tengo una fecha con este formato en un campo:2/3/2012
y necesitaría transformarla a 20120302
¿cómo sugerís hacerlo?

Gracias por adelantado
  #2 (permalink)  
Antiguo 15/03/2012, 12:14
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 12 años, 4 meses
Puntos: 194
Respuesta: formato de fechas

Código PHP:
Ver original
  1. <?php
  2.  
  3. $fecha = "2/3/2012";
  4. $fecha = explode('/',$fecha);
  5. $fecha = $fecha[2]*10000+$fecha[1]*100+$fecha[0];
  6.  
  7. echo $fecha;
  8. ?>
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #3 (permalink)  
Antiguo 15/03/2012, 12:18
 
Fecha de Ingreso: diciembre-2003
Mensajes: 462
Antigüedad: 16 años
Puntos: 5
Respuesta: formato de fechas

Cita:
Iniciado por h2swider Ver Mensaje
Código PHP:
Ver original
  1. <?php
  2.  
  3. $fecha = "2/3/2012";
  4. $fecha = explode('/',$fecha);
  5. $fecha = $fecha[2]*10000+$fecha[1]*100+$fecha[0];
  6.  
  7. echo $fecha;
  8. ?>
Gracias, lo voy a probar y os digo algo.
  #4 (permalink)  
Antiguo 15/03/2012, 12:31
 
Fecha de Ingreso: agosto-2010
Ubicación: Tenerife
Mensajes: 893
Antigüedad: 9 años, 4 meses
Puntos: 202
Respuesta: formato de fechas

No reinventen la rueda.
1 línea usando funciones nativas de php de fecha/hora.

Código PHP:
echo date('Ymd'strtotime('2/3/2012') ); //20120302 
__________________
Pensaba que internet era una gran biblioteca de sabiduría, hasta que comprendí que un libro no puede tener mil páginas llenas de faltas de ortografía... :(
  #5 (permalink)  
Antiguo 15/03/2012, 12:39
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 12 años, 4 meses
Puntos: 194
Respuesta: formato de fechas

Cita:
Iniciado por IEKK Ver Mensaje
No reinventen la rueda.
1 línea usando funciones nativas de php de fecha/hora.

Código PHP:
echo date('Ymd'strtotime('2/3/2012') ); //20120302 
No pongas código que no pruebes primero. "20120203" es tu real salida
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #6 (permalink)  
Antiguo 15/03/2012, 12:41
 
Fecha de Ingreso: agosto-2010
Ubicación: Tenerife
Mensajes: 893
Antigüedad: 9 años, 4 meses
Puntos: 202
Respuesta: formato de fechas

Cita:
Iniciado por h2swider Ver Mensaje
No pongas código que no pruebes primero. "20120203" es tu real salida
No corrigas tonterías. Puse el m antes que el d:

Código PHP:
 echo date('Ydm'strtotime('2/3/2012') ); 
Ya son ganas de joder. ¿O me vas a decir que jota2 no verá q tengo antes el d que la m en el formato?
__________________
Pensaba que internet era una gran biblioteca de sabiduría, hasta que comprendí que un libro no puede tener mil páginas llenas de faltas de ortografía... :(
  #7 (permalink)  
Antiguo 15/03/2012, 12:45
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 12 años, 4 meses
Puntos: 194
Respuesta: formato de fechas

Cita:
Iniciado por IEKK Ver Mensaje
No corrigas tonterías. Puse el m antes que el d:

Código PHP:
 echo date('Ydm'strtotime('2/3/2012') ); 
Ya son ganas de joder. ¿O me vas a decir que jota2 no verá q tengo antes el d que la m en el formato?
No se si lo vera o no, es una buena costumbre probar cosas antes de compartirlas. Mas sabiendo que muchos en el foro tienen conocimientos sumamente básicos y la mayoría de las veces se limitan a copiar y pegar.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #8 (permalink)  
Antiguo 16/03/2012, 03:22
 
Fecha de Ingreso: diciembre-2003
Mensajes: 462
Antigüedad: 16 años
Puntos: 5
Respuesta: formato de fechas

Cita:
Iniciado por h2swider Ver Mensaje
No se si lo vera o no, es una buena costumbre probar cosas antes de compartirlas. Mas sabiendo que muchos en el foro tienen conocimientos sumamente básicos y la mayoría de las veces se limitan a copiar y pegar.
Gracias a los dos. Normalmente no solo copio y pego sino que miro cómo lo habéis hecho para que me sirva para otras veces.

Gracias de verdad. Por cierto, funcionó perfecto
  #9 (permalink)  
Antiguo 21/03/2012, 03:54
 
Fecha de Ingreso: diciembre-2003
Mensajes: 462
Antigüedad: 16 años
Puntos: 5
Respuesta: formato de fechas

Hola otra vez, de nuevo tengo un caso inexplicable para mí. Después de haber probado el otro día el código que me dábais y que funcionaba, ahora resulta que me da todo el rato la misma fecha: 19700101. La fecha que quiero convertir está en una variable que si la muestro mediant echo, me da 4/3/2012.
¿Por qué me pasa esto?

Más datos:
Cuando en la variable que le paso el día tiene un dígito va bien pero si tiene 2 dígitos siempre arroja el mismo número: 19700101
Gracias.

Última edición por jota2; 21/03/2012 a las 04:11
  #10 (permalink)  
Antiguo 21/03/2012, 04:26
 
Fecha de Ingreso: diciembre-2003
Mensajes: 462
Antigüedad: 16 años
Puntos: 5
Respuesta: formato de fechas

Cita:
Iniciado por h2swider Ver Mensaje
Código PHP:
Ver original
  1. <?php
  2.  
  3. $fecha = "2/3/2012";
  4. $fecha = explode('/',$fecha);
  5. $fecha = $fecha[2]*10000+$fecha[1]*100+$fecha[0];
  6.  
  7. echo $fecha;
  8. ?>
Finalmente parece que el código que funciona correctamente es el de h2swider así que igual es mejor "reinventar la rueda".

Gracias a todos
  #11 (permalink)  
Antiguo 21/03/2012, 06:58
 
Fecha de Ingreso: abril-2008
Ubicación: Santa Fe, Argentina
Mensajes: 41
Antigüedad: 11 años, 8 meses
Puntos: 14
Respuesta: formato de fechas

El problema es que '2/3/2012' es ambiguo. Es d/m/Y? O m/d/Y? En el segundo caso, 31 como primer argumento no tendría sentido, porque sólo hay 12 meses. Es por esto que te da la fecha inicial Unix. Ambiguedades similares ocurrirían si usásemos 2 dígitos para el año en lugar de 4.

Ésta deficiencia es mencionada en la [URL="http://php.net/manual/es/function.strtotime.php"]entrada de strtotime en el manual oficial[/URL].

Para esto existe la muy útil e inusualmente inutilizada [URL="http://www.php.net/manual/es/class.datetime.php"]clase DateTime[/URL], la navaja suiza de la fecha en PHP >= 5.3.0. Con sus métodos createFromFormat y Format podemos especificar y mostrar una fecha, respectivamente.


Código PHP:
Ver original
  1. <?php
  2.  
  3. // Nuestro parseador, utilizando la funcion strtotime
  4. function parseFecha_strtotime($fecha)
  5. {
  6.         return date('Ymd', strtotime($fecha));
  7. }
  8.  
  9. // Nuestro parseador, utilizando el objeto DateTime
  10. function parseFecha_DateTime($fecha)
  11. {
  12.         return DateTime::createFromFormat('d/m/Y', $fecha)->format('Ymd');
  13. }
  14.  
  15. // Juego de valores usando barra
  16. $test1 = array('2/3/12', '2/03/12', '02/3/12', '02/03/12', '2/3/2012',
  17.                 '2/03/2012', '02/3/2012', '02/03/2012', '31/03/2012');
  18.  
  19. // Juego de valores usando guion
  20. $test2 = array('2-3-12', '2-03-12', '02-3-12', '02-03-12', '2-3-2012',
  21.                 '2-03-2012', '02-3-2012', '02-03-2012', '31-03-2012');
  22.  
  23. // Unir ambos juegos
  24. $fechas = array_merge($test1, $test2);
  25.  
  26. // Probar con nuestro parseador strtotime
  27. foreach ($fechas as $fecha)
  28.         echo parseFecha_strtotime($fecha) . ' (' . $fecha . ')<br />';
  29.  
  30. echo 'Ahora con DateTime! <br />';
  31.  
  32. // Probar con nuestro parseador DateTime
  33. foreach ($fechas as $fecha)
  34.         echo parseFecha_DateTime($fecha) . ' (' . $fecha . ') <br />';
  35.  
  36. ?>

La salida producida será:

Código HTML:
Ver original
  1. 20120203 (2/3/12)
  2. 20120203 (2/03/12)
  3. 20120203 (02/3/12)
  4. 20120203 (02/03/12)
  5. 20120203 (2/3/2012)
  6. 20120203 (2/03/2012)
  7. 20120203 (02/3/2012)
  8. 20120203 (02/03/2012)
  9. 19691231 (31/03/2012)
  10. 20020312 (2-3-12)
  11. 20020312 (2-03-12)
  12. 20020312 (02-3-12)
  13. 20020312 (02-03-12)
  14. 20120302 (2-3-2012)
  15. 20120302 (2-03-2012)
  16. 20120302 (02-3-2012)
  17. 20120302 (02-03-2012)
  18. 20120331 (31-03-2012)
  19. Ahora con DateTime!
  20. 00120302 (2/3/12)
  21. 00120302 (2/03/12)
  22. 00120302 (02/3/12)
  23. 00120302 (02/03/12)
  24. 20120302 (2/3/2012)
  25. 20120302 (2/03/2012)
  26. 20120302 (02/3/2012)
  27. 20120302 (02/03/2012)
  28. 20120331 (31/03/2012)
  29. Fatal error: Call to a member function format() on a non-object in /var/www/fecha.php on line 9

Podemos apreciar que el parseador strtotime funciona para todos los casos, excepto en '31/03/2012'. Esto está explicado en la entrada del manual de strtotime, se debe a que la barra implica formato americano y 31 no es un mes válido. Sin embargo '31-03-2012' es correctamente convertido tomando 31 como día.

En el parseador DateTime, como en los argumentos pusimos Y en lugar de y, espera 4 dígitos de año y al recibir sólo 2 convierte el año a 0012. Como nuestro formato contempla barras y no guiones, muere al intentar procesar el segundo juego de fechas. Claramente no es para nada indulgente, y si quisiésemos arreglar estas fallas deberíamos hacer un poco más inteligente a nuestra función.

Recapitulando:

Código PHP:
Ver original
  1. <?php
  2.  
  3. // Para pasar de formato en paradigma OO
  4. $fecha = DateTime::createFromFormat('d/m/Y', '2/3/2012');
  5. echo $fecha->format('Ymd') . '<br />';
  6.  
  7. // Para pasar en forma procedural
  8. $fecha = date_create_from_format('d/m/Y', '2/3/2012');
  9. echo date_format($fecha, 'Ymd');
  10.  
  11. ?>

Su salida:

Código HTML:
Ver original
  1. 20120302
  2. 20120302

Ambos paradigmas producen la misma salida, y se pueden encadenar los 2 métodos en el paradigma OO como en el primer ejemplo, o primero asignarlo a una variable y luego mostrar con formato esa variable. Difieren en el tratamiento de errores, pero me imagino que las excepciones se escapan de tu conocimiento.

Etiquetas: formato
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:21.