Je travaille actuellement sur une application de gestion des tâches qui permet aux utilisateurs de créer et d'affecter des tâches, de définir les dates de début et d'échéance et de suivre la progression du travail.
Dans mon application, les utilisateurs ne planifient pas d'heures, ils fixent simplement les dates de début et d'échéance du 10 octobre 2013 au 20 octobre 2013.
Les problèmes surviennent dans le cas où Reporter (créateur de tâche) et Assigné vivent dans des fuseaux horaires différents. En même temps, cela peut être mardi pour Reporter mais toujours lundi pour Assigné. Et vice versa.
De toute évidence, il existe deux façons de gérer les dates:
Mais les deux voies mènent à une folie totale. Jetez un œil aux exemples:
La folie d'utiliser un fuseau horaire commun pour tous les utilisateurs:
La folie d'utiliser l'heure locale de chaque utilisateur:
Ce problème a-t-il une solution? J'ai essayé des idées de conversion des dates dans le fuseau horaire de chaque utilisateur pour permettre à différents utilisateurs de voir la même date de début comme une valeur différente, mais cela ne fonctionne pas correctement dans tous les cas.
Enregistrez toujours les dates et les heures en UTC, en particulier lorsque vous travaillez sur plusieurs fuseaux horaires. Affichez les dates et heures dans le fuseau horaire de l'utilisateur.
Même lorsque vous enregistrez tout en UTC, que signifie "aujourd'hui"? Habituellement, les gens veulent que ce soit quelque part entre aujourd'hui à 0:00 et aujourd'hui à 23:59:59. Ce qui a immédiatement des implications pour quelqu'un dans un autre fuseau horaire, même avec une différence de fuseau horaire d'une seule (ou même demi-heure), une partie de cette journée sera à une autre date.
Ainsi, comme vous l'avez déjà découvert, vous ne pouvez pas utiliser uniquement la date pour enregistrer le début et les exigences dues. Peu importe l'heure à laquelle vous l'enregistrez, le jour diffère pour quelqu'un dans un autre fuseau horaire.
Lorsque j'attribue aujourd'hui comme date de début, ce qui doit être enregistré est "aujourd'hui à 0:00" en heure locale "traduit en UTC. Mais une grande partie de ce jour sera déjà révolue lorsque la tâche sera affectée. Ce qui sera d'autant plus donc pour un cessionnaire dans un fuseau horaire "antérieur". Pour les tâches affectées à une date de début future, vous pouvez utiliser la date plus l'heure de début du jour ouvrable de l'assignateur. Pour les tâches affectées aujourd'hui comme date de début, la date actuelle le temps doit être utilisé (tout est traduit en UTC lorsqu'il est enregistré dans la base de données).
Votre application doit avertir la personne affectant une tâche à quelqu'un dans un fuseau horaire différent si le jour ouvrable de cette personne est déjà (ou presque) terminé. Vous pouvez difficilement vous attendre à ce que quelqu'un commence quelque chose "hier". Il serait probablement utile que vous incluiez dans votre formulaire un échéancier indiquant les heures d'ouverture du cédant et du cessionnaire.