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.
Respuestas:
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
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
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:
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 .... :)
: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 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'));
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);
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 el MÁS del tiempo.
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
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
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 congmdate('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:
$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"
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:
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.
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)
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";
?>
gmdate
lugar de cambiar la zona horaria predeterminada a UTC. Porquegmdate
usa automáticamente UTC.