Ils éprouvent de la difficulté à comparer des heures avec des fuseaux horaires différents en Java?
J'ai 2 date objet dans la base de données qui représentent la société des heures de travail.
Je n'ai besoin que les heures mais depuis que j'ai enregistrer la date. il s'affiche comme ceci:
Date companyWorkStartHour;
Date companyWorkEndHour;
démarrer heures: 12-12-2001-13:00:00
finition heures: 12-12-2001-18:00:00
J'ai le fuseau horaire de l'entreprise et de l'utilisateur. (mon serveur est peut-être dans un autre fuseau horaire).
TimeZone userTimeZone;
TimeZone companyTimeZone;
J'ai besoin de vérifier si l'utilisateur a l'heure actuelle (en tenant compte de son fuseau horaire) est au sein de la société des heures de travail (en tenant compte de la compagnie du fuseau horaire).
Comment puis-je le faire? Je me bats depuis plus d'une semaine avec Java calendrier et sans succès!
La recommandation générale est de stocker tous les temps de l'UTC et de convertir vers et depuis d'autres fuseaux horaires de l'entrée et de la présentation. Ensuite, la comparaison devrait être simple.
Date
et son remplacement moderne Instant
fois l'utilisation de l'UTC à l'interne.OriginalL'auteur Riki | 2010-05-26
Vous devez vous connecter pour publier un commentaire.
La
java.util.Date
classe est un conteneur qui contient un certain nombre de millisecondes depuis le 1er janvier 1970, 00:00:00 UTC. Notez que la classeDate
ne sais pas anyting sur les fuseaux horaires. Utilisation de la classeCalendar
si vous avez besoin de travailler avec les fuseaux horaires. (modifier 19-Jan-2017: si vous utilisez Java 8, utilisez la nouvelle date et l'heure de l'API dans le paquetjava.time
).Classe
Date
n'est pas vraiment adapté à la détention d'un nombre d'heures (par exemple 13:00 ou 18:00), sans date. C'est simplement pas fait pour ça, donc si vous essayez de l'utiliser comme ça, comme vous semblez le faire, vous rencontrerez un certain nombre de problèmes et de votre solution ne sera pas élégant.Si vous oubliez l'utilisation de la classe
Date
pour stocker les heures de travail et de n'utiliser que des entiers, ce sera beaucoup plus simple:Si vous aussi vous voulez prendre quelques minutes (pas seulement les heures) en compte, vous pourriez faire quelque chose comme ceci:
Je suppose que ces heures sont déjà dans le fuseau horaire de l'utilisateur, ne sont-ils pas? Vous pouvez créer un
Calendar
et de définir le fuseau horaire sur elle comme dans mon code ci-dessus, et vous pouvez définir des champs individuels de laCalendar
avecset()
, par exemple:cal.set(Calendar.HOUR_OF_DAY, companyWorkStartHour);
.Oui, Vous avez raison! jusqu'à ce que vous m'a répondu j'ai fait tout comme votre suggestion!
j'ai un scénario similaire. Mais cette solution ne marchera pas pour moi. Parce que mon heure de début et de fin ne sont pas fixés à 13 et 18; il peut être n'importe quoi. Donc la solution échoue lorsque la fourchette est de 23 et 1. Toutes les idées pour une telle situation?
OriginalL'auteur Jesper
Essayer quelque chose comme cela:
OriginalL'auteur Eugene Kuleshov
Je n'ai pas essayé le Joda de la bibliothèque. Ce code devrait fonctionner.
MODIFIER
Mise à jour du code pour refléter Bruno commentaires. Ne pas prendre les dates de la société de travail les horaires.
userCurrentDate
) à 12-12-2001 (à partir decompanyWorkStart/EndHour
).Mais ne serait-il pas de renvoyer la valeur false dans le cas où cela ne se produise?
Oui. Mais la date ne doivent pas être pris en compte dans la comparaison dans ce cas. Il s'intéresse à la vérification si l'utilisateur actuel est entre le début et la fin des heures de travail de sorte que le temps de la partie de l'sauvé companyWorkStart/EndHour dates de la matière.
Point valide. Merci!
Salut! J'ai inséré votre code mais! J'ai reçu ce qui suit dans mes dates: fin.getTime() = 25 Mai 2010 23:00:00 startTime.getTime() = 26 Mai 2010 05:00:00 userCurrentTime.getTime() = 26 Mai 2010, 14:25 (c'est mon temps), ça ne fonctionne pas:) la fin des temps est incorrect!
OriginalL'auteur Snehal
Hé, je ne suis pas sûr de savoir comment vous le faire en utilisant le Java calendrier, mais je vous recommande fortement de l'aide de l'Joda Temps. C'est un système beaucoup plus simple à utiliser et il vous donne les méthodes directes à des extraits de tous les sous-composants de données et de temps, et même tout simplement de créer simple temps des objets sans la date impliqués. Alors j'imagine que ça doit être une question de comparer les 2 fuseaux horaires et en soustrayant la différence de la JodaTime objet.
OriginalL'auteur pie154