php convertir fecha y hora a UTC

90

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.

Jeremey
fuente

Respuestas:

30

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

Phill Pafford
fuente
55
Debería usar en gmdatelugar de cambiar la zona horaria predeterminada a UTC. Porque gmdateusa automáticamente UTC.
empuje el
29
-1 porque no desea cambiar la zona horaria predeterminada global para esto. Solo pide efectos secundarios no deseados.
Ward Bekker
@Phill ¿Qué es 'sz' aquí?
Shahid Karimi
2
Creo que debería ser "Ym-dTG ..." en lugar de "Yd-mTG ..."
Alex Angelico
No me funciona en el proyecto laravel. Su regreso la misma fecha
Dharmender Tuli
109

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'));
dar un toque
fuente
7
¿Un pequeño ejemplo tal vez?
Cherouvim
2
@cherouvim No creo que sea necesario, pero agregó uno de todos modos… Espero que ayude.
empuje el
5
gmdate () es una de esas funciones de PHP con las que me hubiera gustado tropezar hace mucho tiempo. nl2br, ¿alguien?
Charlie Schliesser
1
GMT y UTC no siempre son iguales.
Jay Sheth
1
@poke GMT respeta el horario de verano, UTC no lo hace y es por eso que se usa para que no tenga que tener en cuenta nada más
Necro
72

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
joerx
fuente
La pregunta dice convertir una marca de tiempo en una marca de tiempo, y DateTime no acepta una marca de tiempo como entrada. Tendría que convertirlo en una cadena de alguna manera y luego volver a convertirlo.
felwithe
14

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 .... :)

Johan
fuente
Realmente no entiendo por qué el OP no :D
eligió
@php_nub_qq probablemente porque funciona cambiando la zona horaria de todo el script, lo que podría no ser deseado y podría tener consecuencias no deseadas.
Felwithe
@felwithe No lo haría si se saltara la primera línea, que es solo para demostración
php_nub_qq
11

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);
  • NZDT: UTC + 13: 00
    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";
  • NZST: UTC + 12: 00
    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

Frank Hou
fuente
5

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:

  1. Si tiene un $givenDtobjeto DateTime que desea convertir a UTC, esto lo convertirá a UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. Si necesita el original $givenDtmá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'));
    
  3. 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 $givenStrestá en la zona horaria configurada de PHP.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. 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'));
    
El Coprolal
fuente
4

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);
Christos Pontikis
fuente
4

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.

aorcsik
fuente
3
Aquí hay dos problemas. Primero no debes restar, debes sumar el desplazamiento. En segundo lugar, esto no funciona si la zona horaria local está actualmente en DST y la fecha deseada no es en DST. El desfase tendría una diferencia de una hora. O viceversa. Así que sí, esto funciona la MAYORÍA del tiempo, pero no siempre.
ajon
1

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
MUY Bélgica
fuente
0

tratar

fecha de eco ('F d Y', strtotime ('2010-01-19 00:00:00'));

dará salida:

19 de enero de 2010

debe cambiar el formato de hora para ver otra salida

StevieJ
fuente
0

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"
Sandeep
fuente
0

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.

Bruce Tong
fuente
0

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):

  1. 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;
    
  2. 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)
    
Pradeep Kumar Prabaharan
fuente
-1

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"; 
?>
7 Tonin
fuente
2
Debes editar tu respuesta para explicar cómo esto mejora la respuesta de Phil. ¿Qué cambió en el código y por qué es mejor?
Cody Gray
Cambiar la zona horaria predeterminada de PHP para convertir dos marcas de tiempo es un truco que funciona, pero no una solución elegante.
The Coprolal