Necesito una manera fácil de convertir una marca de fecha y hora a UTC (desde cualquier zona horaria en la que se encuentre el servidor) CON ESPERANZA sin usar ninguna biblioteca.
90
Pruebe getTimezone y setTimezone , vea el ejemplo
(Pero esto usa una clase)
ACTUALIZAR:
Sin clases, 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
gmdate
lugar de cambiar la zona horaria predeterminada a UTC. Porquegmdate
usa automáticamente UTC.Use strtotime para generar una marca de tiempo a partir de la cadena dada (interpretada como hora local) y use gmdate para obtenerla como una fecha UTC formateada.
Ejemplo
Como se solicitó, aquí hay un ejemplo simple:
echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
fuente
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
fuente
Hazlo de esta manera:
gmdate('Y-m-d H:i:s', $timestamp)
o simplemente
gmdate('Y-m-d H:i:s')
para obtener "AHORA" en UTC.
Verifique la referencia:
http://www.php.net/manual/en/function.gmdate.php
fuente
Si tienes una fecha en este formato AAAA-MM-HH dd: mm: ss, puedes engañar a php agregando un UTC al final de tu "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 soluciona el problema del horario de verano.
Una forma un poco extraña de resolverlo .... :)
fuente
:D
Convierta la cadena de la 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);
si $ fecha y hora = "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";
si $ fecha y hora = "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
fuente
Si no le importa usar la clase DateTime de PHP , que ha estado disponible desde PHP 5.2.0, existen varios escenarios que podrían adaptarse a su situación:
Si tiene un
$givenDt
objeto DateTime que desea convertir a UTC, esto lo convertirá a UTC:$givenDt->setTimezone(new DateTimeZone('UTC'));
Si necesita el original
$givenDt
más adelante, también puede querer clonar el objeto DateTime dado antes de la conversión del objeto clonado:$utcDt = clone $givenDt; $utcDt->setTimezone(new DateTimeZone('UTC'));
Si solo tiene una cadena de fecha y hora, por ejemplo
$givenStr = '2018-12-17 10:47:12'
, primero crea un objeto de fecha y hora y luego lo convierte. Tenga en cuenta que esto supone que$givenStr
está en la zona horaria configurada de PHP.$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
Si la cadena de fecha y hora dada se encuentra en una zona horaria diferente a la de su configuración de PHP, entonces cree el objeto de fecha y hora proporcionando la zona horaria correcta (consulte la lista de zonas horarias que admite PHP ). En este ejemplo asumimos la zona horaria local en Ámsterdam:
$givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam')); $givenDt->setTimezone(new DateTimeZone('UTC'));
fuente
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);
fuente
En algún momento 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
todo elMÁS del tiempo.fuente
http://php.net/manual/en/function.strtotime.php o si no necesita usar una cadena sino componentes de tiempo, entonces http://us.php.net/manual/en/function.mktime. php
fuente
Con PHP 5 o superior, puede usar la función datetime :: format (consulte la 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
fuente
tratar
dará salida:
debe cambiar el formato de hora para ver otra salida
fuente
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 marcas de fecha y hora de usuarios de diferentes zonas horarias en una base de datos relacional. Para comparaciones de bases de datos, almacene la marca de tiempo como UTC y use con
gmdate('Y-m-d 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:
fuente
alternativamente, puede probar esto:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
esto dará como resultado:
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.
fuente
Siga estos pasos para obtener la hora UTC de cualquier zona horaria establecida en el sistema local del usuario (esto será necesario para que las aplicaciones web guarden diferentes zonas horarias en UTC):
Javascript (del lado del cliente):
var dateVar = new Date(); var offset = dateVar.getTimezoneOffset(); //getTimezoneOffset - returns the timezone difference between UTC and Local Time document.cookie = "offset="+offset;
Php (del lado del servidor):
public function convert_utc_time($date) { $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:''; if($time_difference != ''){ $time = strtotime($date); $time = $time + ($time_difference*60); //minutes * 60 seconds $date = date("Y-m-d H:i:s", $time); } //on failure of js, default timezone is set as UTC below return $date; } .. .. //in my function $timezone = 'UTC'; $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s') echo strtotime($date. ' '. $timezone)
fuente
Como una mejora en la respuesta de Phill Pafford (no entendí su 'Yd-mTG: i: sz' y sugirió revertir la zona horaria). Así que propongo esto (me compliqué cambiando el formato HMTL en plano / 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"; ?>
fuente