variable hora from formato fecha convertir con php datetime timezone utc

hora - php convert datetime a UTC



datetime from format php (14)

Necesito una forma fácil de convertir un sello de fecha y hora en UTC (desde cualquier zona horaria en la que se encuentre el servidor) DE FORMA PRONTO sin utilizar ninguna biblioteca.


A veces uso este método:

// It is not importnat what timezone your system is set to. // Get the UTC offset in seconds: $offset = date("Z"); // Then subtract if from your original timestamp: $utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));

Funciona casi todo el tiempo.


Como strtotime requiere un formato de entrada específico, se podría usar DateTime::createFromFormat ( se requiere php 5.3+ )

// set timezone to user timezone date_default_timezone_set($str_user_timezone); // create date object using any given format $date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime); // convert given datetime to safe format for strtotime $str_user_datetime = $date->format(''Y-m-d H:i:s''); // convert to UTC $str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime)); // return timezone to server default date_default_timezone_set($str_server_timezone);


Como una mejora en share (no entendí su ''Yd-mTG: i: sz'' y sugirió revertir la zona horaria). Así que propongo esto (lo he complicado cambiando el formato HMTL en texto simple / texto ...):

<?php header(''content-type: text/plain;''); $my_timestamp = strtotime("2010-01-19 00:00:00"); // stores timezone $my_timezone = date_default_timezone_get(); echo date(DATE_ATOM, $my_timestamp)."/t ($my_timezone date)/n"; // changes timezone date_default_timezone_set("UTC"); echo date("Y-m-d/TH:i:s/Z", $my_timestamp)."/t/t (ISO8601 UTC date)/n"; echo date("Y-m-d H:i:s", $my_timestamp)."/t/t (your UTC date)/n"; // reverts change date_default_timezone_set($my_timezone); echo date(DATE_ATOM, $my_timestamp)."/t ($my_timezone date is back)/n"; ?>


Con PHP 5 o superior, puede usar la función de formato datetime :: (ver documentación http://us.php.net/manual/en/datetime.format.php )

echo strftime( ''%e %B %Y'' , date_create_from_format(''Y-d-m G:i:s'', ''2012-04-05 11:55:21'')->format(''U'') ); // 4 May 2012


Convierta una cadena de zona horaria local en una cadena UTC.
por ejemplo, zona horaria de Nueva Zelanda

$datetime = "2016-02-01 00:00:01"; $given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland")); $given->setTimezone(new DateTimeZone("UTC")); $output = $given->format("Y-m-d H:i:s"); echo ($output);

  • NZDT: UTC + 13: 00
    if $ datetime = "2016-02-01 00:00:01", $ salida = "2016-01-31 11:00:01";
    if $ datetime = "2016-02-29 23:59:59", $ salida = "2016-02-29 10:59:59";
  • NZST: UTC + 12: 00
    if $ datetime = "2016-05-01 00:00:01", $ salida = "2016-04-30 12:00:01";
    if $ datetime = "2016-05-31 23:59:59", $ salida = "2016-05-31 11:59:59";

https://en.wikipedia.org/wiki/Time_in_New_Zealand


Función de normalización de propósito general para formatear cualquier marca de tiempo de cualquier zona horaria a otra. Muy útil para almacenar la fecha y hora de los usuarios de diferentes zonas horarias en una base de datos relacional. Para las comparaciones de bases de datos, almacene la marca de tiempo como UTC y utilícela con gmdate(''Ymd H:i:s'')

/** * Convert Datetime from any given olsonzone to other. * @return datetime in user specified format */ function datetimeconv($datetime, $from, $to) { try { if ($from[''localeFormat''] != ''Y-m-d H:i:s'') { $datetime = DateTime::createFromFormat($from[''localeFormat''], $datetime)->format(''Y-m-d H:i:s''); } $datetime = new DateTime($datetime, new DateTimeZone($from[''olsonZone''])); $datetime->setTimeZone(new DateTimeZone($to[''olsonZone''])); return $datetime->format($to[''localeFormat'']); } catch (/Exception $e) { return null; } }

Uso:

$from = [''localeFormat'' => "d/m/Y H:i A", ''olsonZone'' => ''Asia/Calcutta'']; $to = [''localeFormat'' => "Y-m-d H:i:s", ''olsonZone'' => ''UTC'']; datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"



Pruebe getTimezone y setTimezone , vea el ejemplo

(Pero esto usa una Clase)

ACTUALIZAR:

Sin ninguna clase, podrías probar algo como esto:

$the_date = strtotime("2010-01-19 00:00:00"); echo(date_default_timezone_get() . "<br />"); echo(date("Y-d-mTG:i:sz",$the_date) . "<br />"); echo(date_default_timezone_set("UTC") . "<br />"); echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");

NOTA: es posible que también deba volver a establecer la zona horaria en el original


Si tiene una fecha en este formato AAAA-MM-HH dd: mm: ss, puede engañar a php al agregar un UTC al final de su "cadena de fecha y hora" y usar strtotime para convertirlo.

date_default_timezone_set(''Europe/Stockholm''); print date(''Y-m-d H:i:s'',strtotime("2009-01-01 12:00"." UTC"))."/n"; print date(''Y-m-d H:i:s'',strtotime("2009-06-01 12:00"." UTC"))."/n";

Esto imprimirá esto:

2009-01-01 13:00:00 2009-06-01 14:00:00

Y como puede ver, también se ocupa del problema del horario de verano.

Una forma un poco extraña de resolverlo ... :)


Usando DateTime:

$given = new DateTime("2014-12-12 14:18:00"); echo $given->format("Y-m-d H:i:s e") . "/n"; // 2014-12-12 14:18:00 Asia/Bangkok $given->setTimezone(new DateTimeZone("UTC")); echo $given->format("Y-m-d H:i:s e") . "/n"; // 2014-12-12 07:18:00 UTC


Use strtotime para generar una marca de tiempo de la cadena dada (interpretada como hora local) y use gmdate para obtenerla como una fecha UTC formateada.

Ejemplo

Según lo solicitado, aquí hay un ejemplo simple:

echo gmdate(''d.m.Y H:i'', strtotime(''2012-06-28 23:55''));


alternativamente puedes probar esto:

<?php echo (new DateTime("now", new DateTimeZone(''Asia/Singapore'')))->format("Y-m-d H:i:s e"); ?>

esto dará como resultado:

2017-10-25 17:13:20 Asia / Singapur

puede usar esto dentro del atributo de valor de un cuadro de entrada de texto si solo desea mostrar una fecha de solo lectura.

elimine la ''e'' si no desea mostrar su región / país.


tratar

echo date (''F d Y'', strtotime (''2010-01-19 00:00:00''));

dará salida:

19 de enero de 2010

deberías cambiar la hora del formato para ver otra salida