New question

Question:

Date: 28-09-2015 12:57:38 (In Spanish)

Objeto DateTime (conversión de formatos)[Resolved]

Hola a todos, les quería consultar por el objeto DateTime, estoy haciendo una prueba que me da un resultado un tanto extraño, creo el objeto con un string en formato MySQL DateTime ('YYYY-MM-DD HH:MM:SS'), luego obtengo esa fecha en formato timestamp y finalmente muestro el resultado en formato MySQL DateTime, en todo este pasaje se me agregan horas que no comprendo de donde salen, según entiendo el resultado debería ser "2015-08-01 00:00:00", pero termina siendo "2015-08-01 12:00:00", agradecería la colaboración de la comunidad para constestar esto.

Código de ejemplo:
$fechaDB = '2015-08-01 00:00:00';//formato DB
$objDateTime = new DateTime($fechaDB);//creo el objeto DateTime en base a la fecha en formato MySQL DateTime ('YYYY-MM-DD HH:MM:SS')
$fechaTimestamp =  $objDateTime->getTimestamp(); //obtengo la fecha en formato Timestamp
echo 'Fecha Timestamp : ',$fechaTimestamp ,'<br/>','<br/>';
echo 'Fecha DateTime: ', $objDateTime->format('d-m-Y h:i:s'),'<br/>','<br/>';
echo 'Fecha con date(): ', date('d-m-Y h:i:s',$fechaTimestamp); //uso date() para mostrar la fecha timestamp en formato DB
Tags: DateTime - Format - PHP - Question - Time zone - Timestamp - timezone Votes: 2 - Answers: 7 - Views: 14 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 28-09-2015 17:20:57 Hola

    En enero del 2015, estuve jugando un poco con el Objeto DateTime
    He encontrado el codigo con el cual he estado jugando por si a alguien le sirve como para incursionar en el tema.

    <?php
    
    ####################################
    ####....... By: Kapry.......... ####
    ####################################
     
    // Jugando con la clase datetime | doc: http://ar2.php.net/manual/en/class.datetime.php
    
    // Seteo la zona horaria.
    date_default_timezone_set('America/Argentina/Buenos_Aires');
    
    // Creo el Objeto fecha 
    $fecha = new DateTime("2014-12-31");
    
    // Imprimo la fecha con formato d-m-Y
    echo "Fecha [d-m-Y] Original: " . $fecha->format('d-m-Y') . "</br>";
    // Modifico la fecha sumandole un dia mas
    $fecha->modify("+1 day");
    // Imprimo la fecha con formato d-m-Y
    echo "Fecha [d-m-Y] +1 dia:  " . $fecha->format('d-m-Y') . "</br>";
    
    echo "</br>";
    // Creo el Objeto fecha 
    $fecha2 = new DateTime("2015-01-18");
    // Imprimo la fecha con formato d-m-Y
    echo "Fecha [d-m-Y] nueva:  " . $fecha2->format('d-m-Y') . "</br>";
    // Modifico la fecha sumandole un dia menos
    $fecha2->modify("-1 day");
    // Imprimo la fecha con formato d-m-Y
    echo "Fecha [d-m-Y] -1 dia:  " . $fecha2->format('d-m-Y') . "</br>";
    
    
    // Creo el Objeto fecha 
    $fechaHoy = new DateTime("NOW");
    // Imprimo la fecha con formato d-m-Y
    echo "Fecha [d-m-Y] Original: " . $fechaHoy->format('d-m-Y') . "</br>";
    
    echo "</br>";
    // Dias transcurridos, obtengo la diferencia entre dos Fechas la mas reciente, luego la mas antigua
    $diferencia=$fechaHoy->diff($fecha);
    echo "Fecha Hoy:". $fechaHoy->format('d-m-Y') ." Fecha anterior: ".$fecha->format('d-m-Y') . "</br>";
    echo "<b>Resultado del array del Objeto: </b></br></br>";
    // imprimo el resultado
    echo "<pre>";
    print_r($diferencia);
    echo "</pre>";
    


    Demo Online

    La verdad que me entro en curiosidad lo que haz mencionado sobre las horas que agrega
    habra que ponerse a investigar un poco sobre ello.

    Ahora estoy leyendo sobre DateTime::__construct
    Saludos
      Votes: 2 - Link answer
     
  • Date: 28-09-2015 20:59:54 No entiendo mucho del tema, pero haciendo pruebas y una observación creo que se refiere a la zona horaria

    si le seteo la Zona horaria
    $objDateTime = new DateTime($fechaDB, new DateTimeZone('America/Argentina/Buenos_Aires'));//creo el objeto DateTime en base a la fecha en formato MySQL DateTime ('YYYY-MM-DD HH:MM:SS')


    Que tambien se puede establecer la zona horaria para el objeto $objDateTime de la siguiente manera con el método setTimezone()

    Sobre DateTimeInterface

    $objDateTime->setTimezone( new \DateTimeZone( 'America/Argentina/Buenos_Aires' ) );
    


    Otra forma de establecer la zona horaria seria:

    $objDateTime = new DateTime($fechaDB, timezone_open('America/Argentina/Buenos_Aires'));
    


    Aplicando el primer ejemplo el resultado es:

    Fecha Unix: 1438398000

    FechaExcel: 01-08-2015 12:00:00-03:00

    FechaExcel: 01-08-2015 03:00:00+00:00

    Codigo reescrito

    <?php
    $fechaDB = '2015-08-01 00:00:00';//formato DB
    $objDateTime = new DateTime($fechaDB, new DateTimeZone('America/Argentina/Buenos_Aires'));//creo el objeto DateTime en base a la fecha en formato MySQL DateTime ('YYYY-MM-DD HH:MM:SS')
    
    $fechaUnix =  $objDateTime->getTimestamp(); //obtengo la fecha en formato Unix
    echo 'Fecha Unix: ',$fechaUnix,'<br/>','<br/>';
    echo 'FechaExcel: ', $objDateTime->format('d-m-Y h:i:sP'),'<br/>','<br/>'; //aquí es donde obtengo
    echo 'FechaExcel: ', date('d-m-Y h:i:sP',$fechaUnix); //uso date() para mostrar la fecha unix en formato DB
    


    Demo Online

    si por ejemplo establezco la zona 'Europe/London
    $objDateTime = new DateTime($fechaDB,new DateTimeZone('Europe/London'));

    El resultado seria:

    FechaExcel: 31-07-2015 11:00:00

    Espero que sirva de algo.

    De todas maneras habria que continuar estudiando el tema ;)


    Saludos
      Votes: 2 - Link answer
     
  • Date: 29-09-2015 03:00:21 Hola Gustavo:

    El código lo tienes bien, salvo por un pequeño (pequeñísimo) dato/error.
    Cambia 'd-m-Y h:i:s' por 'd-m-Y H:i:s'

    Tu mismo código:
    <?php
    $fechaDB = '2015-08-01 00:00:00';//formato DB
    $objDateTime = new DateTime($fechaDB);//creo el objeto DateTime en base a la fecha en formato MySQL DateTime ('YYYY-MM-DD HH:MM:SS')
    $fechaUnix =  $objDateTime->getTimestamp(); //obtengo la fecha en formato Unix
    echo 'Fecha Unix: ',$fechaUnix,'<br/>','<br/>';
    echo 'FechaExcel: ', $objDateTime->format('d-m-Y H:i:s'),'<br/>','<br/>'; //aquí es donde obtengo
    echo 'FechaExcel: ', date('d-m-Y H:i:s',$fechaUnix); //uso date() para mostrar la fecha unix en formato DB
    ?>


    La explicación (function.date)

    h Formato de 12 horas de una hora con ceros iniciales 01 hasta 12 (No desde 0 que es igual a 12)
    H Formato de 24 horas de una hora con ceros iniciales 00 hasta 23 (No hasta 24)

    h no entiende la hora 00: corresponde a las 12 (de la noche o del mediodía)
    Las 0:30 horas las leerá como las 12:30 de la noche.
      Votes: 4 - Link answer
     
  • Date: 29-09-2015 04:06:54 Muchas gracias Walter y Artzain, me han ayudado a develar el asunto con el DateTime.

    Lo primero que pense fué que me estaba agregando 12 hs, cuando en realidad me estaba mostrando las 00:00:00 en formato AM/PM y no en formato 24hs.

    Doy por cerrada la pregunta, nuevamente muy agradecido, les dejo mi voto.

    Saludos,
      Votes: 1 - Link answer
     
  • Date: 29-09-2015 06:15:26 Genial Artzain!!!! dio en el clavo con una respuesta muy simple.

    Voto a Artzain +1 por la respuesta certera y a Gustavo por plantear la pregunta que me represento un desafío.

    A mi tambien me estaba volviendo loco, llegue a pensdar (erroneamente) que se debia a la zona horaria.
    Yo siempre uso el mismo formato en todo d-m-Y H:i:s, ni me percate que seria eso
    En mi caso aprendí 2 cosas, una es que no hay que ser muy rebuscado en buscar una solución, ya que algo tan pequeño hace toda la diferencia como cambiar h por H en el formato de salida.
    La otra, aprendí a establecer la zona horaria en POO.
    Aunque me queda la curiosidad de conocer la diferencia de UTC y GMT.

    Saludos
      Votes: 0 - Link answer
     
  • Date: 29-09-2015 08:49:40 Curiosidades:

    El tiempo medio de Greenwich o GMT (Greenwich Mean Time /?gren.??'mi:n.ta?m/ ) es un estándar de tiempo que originalmente se refería al tiempo solar medio en el Real Observatorio de Greenwich, en Greenwich, cerca de Londres, Inglaterra, que en 1884 fue elegido por la Conferencia Internacional del Meridiano como el primer meridiano.

    Antes de la introducción del Tiempo Universal Coordinado (UTC) el 1 de enero 1972, el tiempo medio de Greenwich (también conocido como Hora Zulu) era la misma que la hora universal (UT), que es un concepto estándar astronómico que se utiliza en muchos campos técnicos.

    El UTC se obtiene a partir del Tiempo Atómico Internacional, un estándar de tiempo calculado a partir de una media ponderada de las señales de los relojes atómicos, localizados en cerca de 70 laboratorios nacionales de todo el mundo. Debido a que la rotación de la Tierra es constante pero no estable y se retrasa con respecto al tiempo atómico, UTC se sincroniza con el tiempo medio de Greenwich (obtenido a partir de la duración del día solar), al que se le añade o quita un segundo intercalar cuando resulta necesario, siempre a finales de junio o diciembre. La decisión sobre los segundos intercalares la determina el Servicio Internacional de Rotación de la Tierra y Sistemas de Referencia, basándose en sus mediciones de la rotación de la Tierra.

    Los astrónomos ya no utilizan el término "Greenwich Mean Time".

    Tomado de Wikipedia
      Votes: 3 - Link answer
     
  • Date: 29-09-2015 09:36:04 Artzain muchas gracias por la data

    encontré este video al respecto, que tal vez sirva.

    GMT, UTC y UT y EJEMPLOS




    saludos
      Votes: 2 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In