UserTimezone

Ticket #1219

But
Le but est d'afficher les dates pour le fuseau horaire de l'utilisateur connecté.

Dates dans la DB

Toutes les dates de la DB sont au format GMT

Question

Doit-on ajouter un champs dans la config pour régler le GMT réel par rapport à l'heure du serveur. Sous windows, si on est en GMT+2, le GMT de PHP ne va pas être le vrai GMT (sous Linux pas de soucis, il prend bien le GMT).
Celui oblige a faire des calculs en plus, au choix :

  • Conversion au moment d'enregistrer la date dans la DB
  • Conversion à l'affichage de la date (donc timezone utilisateur + ce décalage)

David : j'ai une préférence pour la 2ème solution

Sélection des timezones

La sélection de la timezone :

  1. dans la config générale
  2. dans l'entité
  3. dans les préférences utilisateur

Liste html des timezones : http://fr2.php.net/timezones

Pour récupérer la liste des timezone :

DateTimeZone::listIdentifiers()

Pour avoir les décalages :

$tz = new DateTimeZone(date_default_timezone_get());
var_dump($tz->getTransitions());

LDAP

Si attribut de timezone dans le LDAP, l'importer dans les préférences de l'utilisateur
Possibilité de définir une timezone dans les règles (sur un attribut ou une OU)

Fonctionnement

Uniquement l'affichage utilisera le timezone.
On travaille tout en GMT.

Un utilisateur ouvre un ticket, il l'ouvre sur son fuseau (GMT +4h), au moment de l'enregistrement, une conversion est faite : heure -4 => heure GMT

Le choix de la conversion GMT => timezone de l'utilisateur est via la fonction DateTimeZone de PHP. L'autre solution était d'utiliser la fonction pour MySQL mais celà peut poser problème si on utilise d'autres bases de données dans le futur.

S'il veut consulter une date, la DB sort une date GMT et on ajoute 4h pour l'affichage.
Exemple de code :

$UTC = new DateTimeZone("UTC");
$newTZ = new DateTimeZone("America/New_York");
$date = new DateTime( "2011-01-01 15:00:00", $UTC );
$date->setTimezone( $newTZ );
echo $date->format('Y-m-d H:i:s');

Migration

On considère que GLPI était en GMT

MoYo : est si ce n'est pas le cas ? comment redresser les données ?
David: Je peux faire un script qui moifie tous les champs date avec des requêtes SQL (à mettre dans le dossier tools de GLPI (donc c'est une opération que seul l'admin pourra faire).

heures d'été et hiver

depuis php 5.2 les timezone ont ces informations et calcule automatiquement suivant les fuseau les décalages (hivers / été) et la 0.85 requiert PHP 5.3 mini. Donc pas besoin de s'en préoccuper

Calendriers

  • Un calendrier des jours ouvrés doit utiliser la timezone de l'entité (exemple 8h=>18h)

Question

Comment gérer les calendriers des utilisateurs ayant une timezone différent de celui de l'entité?
David : Pour simplifier, on utilise la timezone de l'utilisateur connecté

Autre question : les heures de lancement des actions automatiques ? on considère les heures du serveur ?
David: oui on considère les heures du serveur. Après si GLPI est utilisé par des gens de toutes les timezone (enfin de beaucoup), il faudra élargir la plage d'exécution ou la réduire (genre l'optimize de la base)