2010-02-16 36 views
10

Acabo de darme cuenta de que si agrego un registro particular a mi base de datos MySQL, tendrá una fecha/hora del servidor y no del usuario en particular y dónde están ubicadas, lo que significa que mi función de búsqueda por fecha es inútil. Como no podrán buscar cuando lo hayan agregado en su zona horaria, más bien cuando se haya agregado en la zona horaria de los servidores. Hay una manera en Codeigniter de establecer globalmente la fecha y hora específicas de la ubicación de un usuario (tal vez usando su IP) y cada vez que llamo a date() o time() que los usuarios usan la zona horaria.PHP, Codeigniter: ¿Cómo establecer la fecha/hora según la zona horaria/ubicación de los usuarios en una aplicación web?

Lo que en realidad estoy pidiendo es probablemente Cómo hacer que mi aplicación dependientes entre usuarios de zona horaria?

Tal vez es mejor almacenar la zona horaria de cada usuario en su perfil y tener un horario estándar (tiempo de servidor) y luego convertir el tiempo para cada usuario?

Gracias a todos

+0

@Abs - Mi post de abajo cubre cómo hacer una aplicación web en PHP zona horaria sensible, independientemente de la MVC en el que estás trabajando. Lo que hice fue tomar los principales que anoté a continuación y escribí un ayudante llamado utc_helper que me facilitó hacer cosas como obtener la hora actual con utc_now() o convertir tiempos con utc_convert ($ time, $ from_zone, $ to_zone). Si tiene alguna pregunta al respecto hágamelo saber que estaré encantado de ayudarlo. – Shane

Respuesta

4

creo que la forma más fácil es definir una zona horaria para el almacenamiento de datos interno (zona horaria de su servidor o UTC) y convertir el tiempo de acuerdo a la zona horaria del usuario cuando la salida de la misma.

No conozco CodeIgniter, así que no puedo indicarle las funciones correctas. Una biblioteca destacada que reconoce la zona horaria es Zend_Date: Working with Timezones Aún no he trabajado con estas funciones pero parecen prometedoras.

Sin embargo, una vez que conoce el huso horario del usuario, no es difícil armar una función propia que agregue/sustraiga el desplazamiento al dar salida a las fechas y/o horas.

pregunta posiblemente relacionados:

+0

eres primero por segundos, argh! :] –

+0

Gracias Pekka :) – Abs

1

Creo que volver a calcular con el tiempo del usuario es una mejor opción, ya que le da tiempo normalizado en el servidor, es decir, si tendrá que buscar algo , eso sucedió (desde su punto de vista) hace una hora, no tendrá un lío con americano, asiático y por ejemplo tiempo australiano.

sólo hay que preguntar por su zona horaria (normalmente seleccione con las principales ciudades de esa zona horaria) y luego volver a calcular :)

O, alternativamente, puede almacenar dos TIMEDATES - uno para su comparación y uno para mostrar, por lo que no tendrás tantos cálculos en el servidor.

Además, si volver a calcular, puede utilizar la fecha ayudante: http://ellislab.com/codeigniter/user-guide/helpers/date_helper.html

5

Suena como lo que tiene que hacer es almacenar toda la fecha y la hora en el sistema como hora UTC (que antes se llamaba GMT) . Este es el tiempo base en el que se calcula todo en el mundo con ajustes. (Por ejemplo: El horario central es de -6 horas fuera de UTC)

En MySQL puede usar UTC_TIMESTAMP() para obtener la hora UTC actual siempre que su servidor y su base de datos estén configurados con los horarios correctos y la configuración de la zona horaria.

En PHP ejecutar esta opción para establecer la fecha y hora de PHP a UTC (que se ejecutará esto en su código para ponerlo en cada página o en un archivo de índice centralizado):

date_default_timezone_set('UTC'); 

O puede ir directamente en PHP.INI y dile que use la hora UTC de forma global. (Esto puede no funcionar si tiene varios sitios web en una sola instalación de PHP

Y a continuación, en cualquier parte del sistema que necesita para obtener la hora UTC actual sólo se puede llamar:.

time(); 

Luego, para cada usuario en el sistema deberá preguntarles en qué zona horaria viven y luego, cuando muestre las horas, haga el ajuste para ese usuario. De modo que si son las 5:00 PM UTC y vivo en Easter US (-5), el tiempo sería 5:00 - 5 horas = 12:00 PM.

Este puede ser un proceso largo para hacerlo bien, pero una vez que lo haga, sus usuarios lo encontrarán muy útil especialmente a nivel internacional.

1

Tome un ejemplo de una aplicación web existente como WordPress y phpBB. Cada usuario tiene su propia configuración de zona horaria.

Cuando se recibe un contenido del usuario, el uso local_to_gmt() función en el Date Helper a continuación, guardar el contenido en base de datos utilizando la fecha GMT. Cuando recupere los datos, obtendrá el tiempo en gmt. Obtenga la configuración de la zona horaria del usuario y luego visualice los datos en esa zona horaria.

De esta forma, puede evitar el cálculo entre dos zonas horarias. Solo asegúrese de que la hora de su servidor esté en la configuración correcta, de modo que todos sus datos estén en el tiempo correcto de GMT.

ACTUALIZACIÓN:

Recientemente comprobar el último proyecto en el que trabajé en ese tema tienen zona horaria. Después de pensar diferentes escenarios, aquí está la solución para el problema de zona horaria:

  1. Todos los datos almacenados en este momento ya usando el tiempo del servidor. Cambiar esto tomará tiempos y propenso al error, así que lo dejo así.
  2. Para los nuevos datos del usuario que establecieron la fecha del contenido en cierta fecha y hora , lo almacené en la columna 2 . La primera columna es para almacenar los datos tal como están, y se usan para mostrar como está. La segunda columna será un recálculo de la fecha basada en la zona horaria del usuario en la zona horaria del servidor. Esta columna se utiliza en el WHERE declaración (filtro en función de la fecha servidor) y para el ORDER (puesto que el valor de esta columna todos en misma zona horaria, que es la zona horaria del servidor).

De esta manera, solo hago 1 cálculo de zona horaria, que es para convertir la fecha del usuario en la fecha del servidor. Para mostrar, visualizo la fecha según la fecha y hora del servidor. Dado que todos los datos almacenados en la misma zona horaria, los datos pueden ordenarse por la columna que contiene el valor de fecha del servidor.

Para el usuario que ha configurado su zona horaria, la fecha de la base de datos se puede volver a calcular fácilmente para obtener la fecha y hora en la zona horaria del usuario. Por cierto, en mi aplicación, muestro la fecha usando timeago jquery plugins. Estos complementos necesitan tiempo en el formato ISO8601 (hora UTC). Se puede usar la función local_to_gmt() en CodeIgniter para hacer esto.

+0

Me gusta esta solución ... – foxybagga

1

Obviamente, el salto al horario de verano británico (horario de verano) es una gran confusión en el mundo de la programación, y estoy atrapado en esa confusión.

La mejor solución posible que pueda encontrar (que voy a tratar de explicar coherentemente) cuando se utiliza un sistema sensible zona horaria es la siguiente:

  • el servidor web y base de datos deben ser a la vez se salga de la misma zona horaria máquina. Sugiero UTC, ya que es el componente básico de las conversiones de zona horaria. Esto asegurará que todas las fechas almacenadas en su base de datos sean constantes, y no omita ningún momento, como el salto de 1 hora entre Horario de verano.
  • En la parte superior de todos sus scripts PHP, use date_default_timezone_set('Europe/London'); con la zona horaria específica del usuario.
  • Al producir fechas de formularios enviados por el usuario, use gmmktime(); para asegurarse de que la marca de tiempo creada sea UTC y no la modifique la zona horaria que ha establecido.
  • date(); se puede utilizar al mostrar las fechas, ya que esto convertirá la marca de tiempo en la hora correcta teniendo en cuenta la zona horaria que ha configurado.
  • Si necesita mostrar una fecha en el formato UTC, utilice gmdate(); con $gm_timestamp que haya tomado de la base de datos o creado con gmmktime();.

He escrito este pedacito de PHP para ayudar a entender la situación.

date_default_timezone_set('UTC'); 
$gmtime = gmmktime(2,0,0,03,29,2009); 
$time = mktime(2,0,0,03,29,2009); 
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />'; 
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />'; 

date_default_timezone_set('Europe/London'); 
$gmtime = gmmktime(2,0,0,03,29,2009); 
$time = mktime(2,0,0,03,29,2009); 
echo $gmtime.'<br />'.date('r',$gmtime).'<br />'.gmdate('r',$gmtime).'<br />'; 
echo $time.'<br />'.date('r',$time).'<br />'.gmdate('r',$time).'<br />'; 

Afortunadamente he hecho un buen trabajo, pero lo dudo porque todavía estoy tratando de resolver el problema en mi cabeza.

ACTUALIZACIÓN:

contento de haber hecho esto, porque ahora estoy teniendo dudas sobre el usuario introduce las fechas.

Para obtener la fecha introducida por el usuario (teniendo en cuenta su zona horaria) para coincidir con la fecha correspondiente de UTC en la base de datos, debe ponerla en mktime(). Y luego use gmdate('U', $timestamp); para obtener la marca de tiempo UTC verdadera. (Creo)

Ejemplo

Mirándolo desde un lado de la presentación de informes, el usuario está utilizando la 'Europa/Londres' zona horaria. Al comienzo de nuestro script PHP llamamos al date_default_timezone_set('Europe/London');, mientras que la Base de datos (y todos los registros dentro) todavía están en UTC.

El usuario luego envía a través del cual desea seleccionar una lista de libros añadidos a la base de datos entre el 25/03/2010 10:00 al 30/03/2010 14:00. El script PHP luego ejecuta las variables de fecha a través de mktime($hour, $minute, $second, $month, $day, $year) para generar una marca de tiempo UTC correcta.La fecha de inicio no cambiará, pero PHP sabe que la fecha de finalización está dentro de la zona horaria BST, por lo que cambia la marca de tiempo a UTC en consecuencia.

Cuando se devuelven los resultados al usuario, date('r', $date_added) se puede utilizar para mostrar al usuario la fecha en que se agregó el libro a la base de datos de acuerdo con su zona horaria establecida.

Este enlace puede ayudar a entender cuándo cambia. http://www.daylightsavingtime.co.uk/

0

He utilizado la conversión de zona horaria integrada de MySQL. En la base de datos, todos los datetimes se almacenan como UTC. En la consulta de selección, utilicé CONVERT_TZ para convertir a la zona horaria del usuario. Puede especificar códigos de zona horaria o invervals hora como:

SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); 
SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); 

Pero, el problema es que esto no se ajustan con los tiempos de horario de verano. Esto es particularmente frustrante ya que muchas partes del mundo no respetan el horario de verano o lo respetan en diferentes fechas. Por lo tanto, si se instala el timezone description tables, puede utilizar nombres descriptivos que dar cuenta de los cambios de horario de forma automática gustaría:

SELECT CONVERT_TZ('2004-01-01 12:00:00', 'UTC', 'US/Eastern'); 
0

CodeIgniter contiene un ayudante que se ocupa de todo tipo de funciones de fecha.

Codeigniter Date helper

la gmt_to_local de comandos() debería ayudar ... el tercer parámetro es para 'daylight_saving'.

Takes a Unix timestamp (referenced to GMT) as input, and converts it to a localized timestamp based on the timezone and Daylight Saving time submitted. Example: 
$timestamp = '1140153693'; 
$timezone = 'UM8'; 
$daylight_saving = TRUE; 

echo gmt_to_local($timestamp, $timezone, $daylight_saving); 
0

Añadir esta línea para autoload.php en la carpeta carpeta application/config:

$autoload['time_zone'] = date_default_timezone_set('Asia/Kolkata'); 
Cuestiones relacionadas