2012-04-17 10 views
13

Tengo un sitio con una función de comentarios donde la marca de tiempo del comentario se almacena en una base de datos MySQL. Por lo que entiendo, la marca de tiempo se convierte a UTC cuando se almacena, luego se convierte de nuevo a la zona horaria predeterminada cuando se recupera. En mi caso, mi servidor está en la zona horaria Central Daylight Time (CDT).PHP & MySQL: Convertir TIMESTAMP almacenado en la zona horaria local del usuario

Tengo un plan para obtener la zona horaria de cada usuario mediante el formulario de entrada. Solo quería saber cómo convertir el valor TIMESTAMP en la zona horaria del usuario.

  • En primer lugar, ¿me convertiría de UTC a la zona horaria local? O CDT a la zona horaria local?
  • En segundo lugar, ¿cómo haré para hacerlo en PHP? ¿Me acaba de hacer:
 
$userTimezone = new DateTimeZone($userSubmittedTimezoneString); 
$myDateTime = new DateTime($storedTimestamp, $userTimezone); 

... o es que no es correcta?

+2

no, las marcas de tiempo se almacenan como están en mysql, pero sin ningún tipo de datos TZ. si inserta "3pm, CST" en el db, entonces 3pm, cst es lo que está almacenado. Tendrá que convertir a UTC antes de insertar para que tenga una base común e invariable para convertir a otras ZT. –

Respuesta

20

fecha/hora/fecha y hora valores son almacenados en MySQL como suministrarlos. Es decir. si INSERT la cadena 2012-04-17 12:03:23 en una columna DATETIME, ese es el valor que se almacenará. Se convertirá internamente en una marca de tiempo que puede ser o no precisa (ver a continuación), pero cuando vuelva a consultar el valor, obtendrá el mismo valor de nuevo; el viaje de ida y vuelta es transparente.

Pueden ocurrir problemas si intenta hacer cálculos de tiempo dentro de SQL. Es decir. cualquier operación que requiera SQL para tener en cuenta la zona horaria y/o el tiempo del servidor. Por ejemplo, usando NOW(). Para cualquiera de esas operaciones, la zona horaria y/o el tiempo del servidor deben establecerse correctamente. Ver Time Zone Problems.

Si eso no te concierne y solo necesitas hacer cálculos en PHP, solo necesitas asegurarte de saber desde qué zona horaria quieres cambiar la zona horaria. Para ello, puede ser conveniente para estandarizar todos los tiempos a UTC, pero no es necesario, ya que las conversiones de zona horaria desde cualquier zona horaria a cualquier otra zona horaria funcionan igual de bien, siempre y cuando tenga claro qué zona horaria convirtiendo desde y hacia.

date_default_timezone_set('Asia/Tokyo'); // your reference timezone here 

$date = date('Y-m-d H:i:s'); 

/* INSERT $date INTO database */; 

$date = /* SELECT date FROM database */; 

$usersTimezone = new DateTimeZone('America/Vancouver'); 
$l10nDate = new DateTime($date); 
$l10nDate->setTimeZone($usersTimezone); 
echo $l10nDate->format('Y-m-d H:i:s'); 
+0

Este código es el mejor para satisfacer mis necesidades. Sin embargo, creo que sería mejor almacenar husos horarios de una manera como esta: http://blog.benkuhl.com/2009/12/timezone-list-in-mysql/ con los desplazamientos especificados. Es una mejor forma de presentarle las opciones al usuario. Con zonas horarias almacenadas de esa manera, y si conozco la zona horaria del servidor (que parece ser CDT), ¿cómo puedo usar el desplazamiento conocido (por ejemplo -5.0, 3.0) en los valores almacenados 'TIMESTAMP' en la base de datos? – TerranRich

+0

@Terran Realmente desea utilizar zonas horarias por sus identificadores nombrados, no simplemente por un desplazamiento. Las compensaciones cambian a lo largo del año en función de las regulaciones locales de ahorro de luz diurna, y todas son diferentes. Si el usuario elige hoy "DST -06: 00", no tiene idea de qué zona horaria es y cuándo cambiará a "DST -07: 00" o "DST -05: 00". Debe permitir que el usuario elija una zona horaria con nombre. Puede calcular y visualizar el desplazamiento en el momento en que el usuario lo elija, si así lo desea. – deceze

+0

OK, entonces al presentar el cuadro de lista para que los usuarios elijan, los valores enviados a la base de datos serán 'America/New_York' ... ¿hay alguna manera de mostrar el desplazamiento * actual * de' America/New_York' y otros a GMT cuando les da la opción? \t Tal vez algo como la respuesta a http://stackoverflow.com/questions/1727077/generating-a-drop-down-list-of-timezones-with-php sería la forma de generar la lista para el usuario ? – TerranRich

1

No hay una manera confiable de obtener la zona horaria del usuario. La información de zona horaria no se envía en encabezados HTTP. Lo mejor que se puede hacer es o bien:

  1. de ajuste de la dirección IP againsta base de datos geográfica -o-
  2. el uso de JavaScript para obtener el tiempo establecido en el ordenador del usuario y envía ya sea que el servidor (AJAX) o hacer la cadena de tiempo en el cliente.
+4

Él ya tiene una forma de obtener la zona horaria. Les pide a los usuarios que seleccionen la zona horaria en la que se encuentran. Lo que él quiere es una forma de convertir la hora en la zona horaria especificada. – Jack

+0

Ya veo, gracias Jack. – dotancohen

0
$timezone = new DateTimeZone('America/Vancouver'); 

$date = new DateTime(date('m/d/Y h:i:s a', time())); 
$date->setTimeZone($timezone); 
echo $date->format('l F j Y g:i:s A')."\n"; 

Reemplazar new DateTime(date('m/d/Y h:i:s a', time())); con new DateTime("UTC Time");

Puede crear un nuevo DateTimeZone() objeto para cada entrada del usuario.

0

La forma de hacerlo es mediante el uso de javascript. Creo que la mejor manera de hacerlo es almacenando los usuarios de GMT en sus cookies y recuperándolos en el formulario de proceso de PHP.

<script language="javascript"> 

function TimeZoneCookie() 
{ 
var u_gmt = (-(new Date().getTimezoneOffset()))/60; 
var o_date = new Date("December 31, 2025"); 
var v_cookie_date = o_date.toGMTString(); 
var str_cookie = "utimezone="+u_gmt; 
str_cookie += ";expires=" + v_cookie_date; 
document.cookie=str_cookie; 
} 
//--------------------- 
TimeZoneCookie(); 

</script> 

u_gmt explicó:

  1. Date().getTimezoneOffset() devuelve el compensar a GMT-0 en minutos
  2. Desde getTimezoneOffset() devolverá el compensar a GMT-0 y no a GMT-0 tendremos que darle la vuelta. ¿Cómo? simple, con solo saber que -*-=+ & -*+=-. Si conoces las matemáticas básicas, ya sabes este principio.
  3. Como dije en paso 1getTimezoneOffset() devolverá el desplazamiento en minutos, por lo que solo lo dividiremos por 60, para que podamos obtener el formato de desplazamiento gmt.

Resultado:(-(new Date().getTimezoneOffset()))/60


Ahora obtener la cookie en PHP:

<?php 

$user_timezone = $_COOKIE['utimezone']; 

?> 
Cuestiones relacionadas