gmdate - time zone set php
¿Cómo obtengo Greenwich Mean Time en PHP? (6)
Tengo un servidor que está configurado para EST, y todos los registros en la base de datos están configurados para EST. Me gustaría saber cómo configurarlo para GMT. Quiero ofrecer una opción de zona horaria a mis usuarios.
Aquí hay una lista de las zonas horarias con GMT diferente, ¡espero que esto sea útil!
echo ''<pre>'';
$zones_array = array();
$timestamp = time();
# to maintain the original timezone, store before
$default_timezone = date_default_timezone_get();
foreach (timezone_identifiers_list() as $key => $zone) {
date_default_timezone_set($zone);
$zones_array[$key][''zone''] = $zone;
$zones_array[$key][''diff_from_GMT''] = date(''P'', $timestamp);
}
# to maintain the original timezone, re-set after
date_default_timezone_set($default_timezone);
print_r($zones_array);
¡Gracias!
Es importante tener en cuenta que si está utilizando la fecha (''Z'') para convertir una fecha que está almacenada en una base de datos, le da a la fecha la marca de tiempo como segundo argumento, de lo contrario, su resultado no será exacto.
p.ej
En el Reino Unido, a veces la fecha (''Z'') dará 3600, a veces dará 0.
echo date(''Z'', strtotime(''2012-01-01''));
Da 0
echo date(''Z'', strtotime(''2012-07-01''));
Da 3600
Por lo tanto, puramente usar strtotime ($ dbDateValue) - la fecha (''Z'') puede ser incorrecta
En su lugar, utilice:
$dbDateTimestamp = strtotime($dbDateValue); // where $dbDateValue something like 2012-01-01 22:34:00
$utcTimestamp = strtotime($dbDateTimestamp) - date(''Z'', $dbDateTimestamp);
Por supuesto, esto se basa en PHP y la base de datos está configurada en la misma zona horaria.
Esta pregunta me inspiró a escribir una función alternativa para convertir una marca de tiempo en una zona horaria necesaria.
Entonces, CORREGIR los pasos del procedimiento para registrar, visualizar (convertir) el tiempo:
1) record timestamp with time()
2) If you need to get a different timezone, use:
2.1) Class based:
2.1.1) DateTime class + setTimezone
or
2.1.2) date_default_timezone_set() and then date()
2.1.1) is better and more flexible than 2.1.2)
Function:
function getLTime_class($ts, $uTZ, $format_str="Y.m.d H:i", $sTZ="America/Toronto"){
// $ts - timestamp recorded with time(); if have date => convert to timestamp: strtotime($date_input); //for ex strtotime(''2012-02-17 12:00:00''); => 1345219200 - same value for summer and winter (for toronto timezone);
// $uTZ - TZ string (ex: ''America/Toronto''); convert timestamp to this TimeZone
// $sTZ - TZ string (ex: ''America/Toronto''); convert timestamp from this TimeZone
$TimeZone_server=new DateTimeZone($sTZ);
$date_obj=new DateTime("@$ts", $TimeZone_server);
$TimeZone_local=new DateTimeZone($uTZ);
$date_obj->setTimeZone($TimeZone_local);
return $date_obj->format($format_str);
}
Usage:
$date_input=$_POST[''date_input'']; //read from POST
$ts=strtotime($date_input); //for ex strtotime(''2012-02-17 12:00:00''); => 1345219200 - same value for summer and winter (for toronto timezone);
$userTZ=''America/Toronto''; //read from user params
$result=getLTime_class($ts, $userTZ, ''Y-m-d H:i:s'');
2.2) Non-Class based:
Function:
//this function replaces the function with DateTime class. It''s faster. $uTZoffset is integer.
function getLTime_nonclass($ts, $uTZoffset, $format_str="Y.m.d H:i"){
// $ts - timestamp recorded with time(); if have date => convert to timestamp: strtotime($date_input); //for ex strtotime(''2012-02-17 12:00:00''); => 1345219200 - same value for summer and winter (for toronto timezone);
// $uTZoffset - TZ offset (integer) $uTZoffset must consider DTS (for ex: in summer $uTZoffset=-4; in winter $uTZoffset=-5)
$ts_offset=date(''Z'',$ts);
if ($uTZoffset) $add_offset=$ts_offset-date(''Z''); //when not UTC
else $add_offset=0; //when UTC
return date($format_str,$ts-$ts_offset+$uTZoffset*3600+$add_offset);
}
Usage:
$date_input=$_POST[''date_input'']; //read from POST
$ts=strtotime($date_input); //for ex strtotime(''2012-02-17 12:00:00''); => 1345219200 - same value for summer and winter (for toronto timezone);
$uTZoffset=-4; //read from user params. $uTZoffset - TZ offset (integer) $uTZoffset must consider DTS (for ex: in summer $uTZoffset=-4; in winter $uTZoffset=-5)
$result=getLTime_nonclass($ts, $uTZoffset, ''Y-m-d H:i:s'');
Resultados:
$ date_input = 2012-08-17 12:00:00
Server date: summer (2013-08-26)
getLTime_class => $userTZ=''America/Toronto'' => 2012-08-17 12:00:00
getLTime_nonclass => $uTZoffset=-4 => 2012-08-17 12:00:00
getLTime_class => $userTZ=''UTC'' => 2012-08-17 16:00:00
getLTime_nonclass => $uTZoffset=0 => 2012-08-17 16:00:00
Server date: winter (2013-02-26)
getLTime_class => $userTZ=''America/Toronto'' => 2012-08-17 12:00:00
getLTime_nonclass => $uTZoffset=-5 => 2012-08-17 12:00:00
getLTime_class => $userTZ=''UTC'' => 2012-08-17 16:00:00
getLTime_nonclass => $uTZoffset=0 => 2012-08-17 16:00:00
$ date_input = 2012-02-17 12:00:00
Server date: summer (2013-08-26)
getLTime_class => $userTZ=''America/Toronto'' => 2012-02-17 12:00:00
getLTime_nonclass => $uTZoffset=-4 => 2012-02-17 12:00:00
getLTime_class => $userTZ=''UTC'' => 2012-02-17 17:00:00
getLTime_nonclass => $uTZoffset=0 => 2012-02-17 17:00:00
Server date: winter (2013-02-26)
getLTime_class => $userTZ=''America/Toronto'' => 2012-02-17 12:00:00
getLTime_nonclass => $uTZoffset=-5 => 2012-02-17 12:00:00
getLTime_class => $userTZ=''UTC'' => 2012-02-17 17:00:00
getLTime_nonclass => $uTZoffset=0 => 2012-02-17 17:00:00
Decidí obtenerLTime_nonclass con la esperanza de hacer la conversión más rápida que usando clases. Todo lo que pido es confirmar que getLTime_nonclass es un reemplazo válido para getLTime_class. Por favor, siéntase libre de expresar su opinión. Gracias
Mucho tiempo es tarea cuando es necesario registrar el tiempo en DB en GMT + 0, pero el tiempo de función () devolverá el tiempo del servidor. Su posible resolución por la siguiente función:
/**
* Converts a local Unix timestamp to GMT
*
* @param int Unix timestamp
* @return int
*/
function local_to_gmt($time = '''')
{
if ($time === '''')
{
$time = time();
}
return mktime(
gmdate(''G'', $time),
gmdate(''i'', $time),
gmdate(''s'', $time),
gmdate(''n'', $time),
gmdate(''j'', $time),
gmdate(''Y'', $time)
);
}
Recomiendo encarecidamente que evite jugar con las marcas de tiempo de UNIX para que se vea como una zona horaria diferente. Esta es una lección que he aprendido de la manera difícil, demasiadas veces.
Una marca de tiempo es el número de segundos desde la medianoche del 1 de enero de 1970, GMT. No importa dónde se encuentre en el mundo, una marca de tiempo dada representa el mismo momento exacto, independientemente de las zonas horarias. Sí, la marca de tiempo "0" significa 10am 1/1/70 en Australia, Midnight 1/1/70 en Londres y 5pm 31/12/69 en LA, pero esto no significa que simplemente pueda agregar o restar valores y garantizar exactitud.
El ejemplo de oro que me llenó cada año durante demasiado tiempo fue cuando surgirían las horas de verano. El horario de verano significa que hay "horas de reloj" que no existen en ciertas partes del mundo. Por ejemplo, en la mayor parte de los EE. UU., El 2 de abril de 2006 no hubo horas como las 2:01 a.m.
Sin embargo, basta de perturbación cuasi-inteligible. Mi consejo es almacenar sus fechas en la base de datos como marcas de tiempo, y luego ...
- Si necesita la hora local en el servidor, use
date()
- Si necesita obtener GMT, use
gmdate()
- Si necesita obtener una zona horaria diferente, use
date_default_timezone_set()
y luegodate()
Por ejemplo,
$timestamp = time();
echo "BRISBANE: " . date(''r'', $timestamp) . "/n";
echo " UTC: " . gmdate(''r'', $timestamp) . "/n";
date_default_timezone_set(''Africa/Johannesburg'');
echo " JOBURG: " . date(''r'', $timestamp) . "/n";
// BRISBANE: Tue, 12 May 2009 18:28:20 +1000
// UTC: Tue, 12 May 2009 08:28:20 +0000
// JOBURG: Tue, 12 May 2009 10:28:20 +0200
Esto mantendrá sus valores limpios (no tiene que preocuparse por agregar compensaciones y luego restar antes de guardar), respetará todas las reglas del horario de verano y tampoco tendrá que buscar la zona horaria del lugar. usted quiere.
No importa en qué zona horaria de GMT se encuentre el servidor, esta es una forma extremadamente fácil de obtener la hora y la fecha para cualquier zona horaria. Esto se hace con las funciones time()
y gmdate()
. La función gmdate()
normalmente nos da el tiempo GMT, pero al hacer un truco con la función time()
podemos obtener GMT + N o GMT-N, lo que significa que podemos obtener la hora para cualquier zona horaria GMT.
Por ejemplo, si tiene que obtener el tiempo para GMT + 5, puede hacerlo de la siguiente manera
<?php
$offset=5*60*60; //converting 5 hours to seconds.
$dateFormat="d-m-Y H:i";
$timeNdate=gmdate($dateFormat, time()+$offset);
?>
Ahora, si tiene que obtener el tiempo para GMT-5, simplemente puede restar el desplazamiento del time()
lugar de agregarlo, como en el siguiente ejemplo, donde obtenemos el tiempo para GMT-4
<?php
$offset=4*60*60; //converting 4 hours to seconds.
$dateFormat="d-m-Y H:i"; //set the date format
$timeNdate=gmdate($dateFormat, time()-$offset); //get GMT date - 4
?>