7
votes

Comment déterminer si un horodatage est dans les heures de travail?

Compte tenu de n'importe quel horodatage UNIX (c'est-à-dire 1306396801) qui se traduit par 26.05.2011 08:00:01, comment puis-je déterminer si cela se trouve dans un délai donné (c'est-à-dire 08:00:00 et 16:00:00)?

Cela doit fonctionner pendant n'importe quel jour. Je veux juste savoir si cet horodatage est dans l'intervalle de temps donné, sur toute journée future (ou passée), la date est sans importance. Je m'en fiche si c'est le 25 ou le 26, tant qu'il est compris entre 08h00 et 16h00.

Je suis à la recherche d'une solution Java, mais tout pseudo code qui fonctionne sera correct, je vais simplement le convertir.

Mes tentatives jusqu'à présent converties en un calendrier Java et lisent les valeurs hour / min / s et les comparant, mais cela vient d'ouvrir une grande boîte de vers. Si l'intervalle de temps, je le veux entre 16,30, je ne peux pas simplement vérifier pour Tshour> Framestarthour && Tsmin> Framestartmin que cela jettera tous les horodatages qui ont une pièce minute> 30.

Merci d'avoir regardé ceci :)

clarifier. Je n'utilise que et faisant référence à l'UTC Time, mon horodatage est en UTC et la plage que je souhaite dans l'intérieur est dans UTC.


3 commentaires

Dans quel fuseau horaire? Le fuseau horaire local du client? Utilisez-vous l'heure d'été de la journée?


J'utilise UTC (AKA GMT)


Merci pour toutes les suggestions, je vais faire des tests et voir comment ça va :)


5 Réponses :


1
votes

Votre horodatage Unix est un moment absolu. Votre trame de temps est relative. Vous avez besoin d'une sorte d'informations sur le fuseau horaire afin de résoudre ce problème. Je viens de répondit à une partie de cela pour PostgreSQL il y a quelques minutes. Espérons que cet article est utile.


1 commentaires

Ok, je pense que je reçois la partie sur l'heure relative, mais mon horodatage et la plage de l'heure / min / sec, je le souhaite dans l'UTC.



0
votes

Convertissez le début de votre plage en horodatage UNIX et la fin de votre plage à un TMESTAMP UNIX, alors c'est un simple contrôle entier.


1 commentaires

Oui et non. Si je veux faire cela seulement pendant 1 jour, c'est un morceau de gâteau. Mais ce n'est pas ce que je veux, je veux obtenir "vrai" si cet horodatage a eu une heure et une pièce minute entre un intervalle défini.



2
votes

Compte tenu de votre horodatage (en secondes) et de la fuseau horaire souhaité, Jodatime vous donne l'heure qui vous conduit à une simple vérification de la gamme entier. XXX

avec Java.util. * C'est plus difficile.


5 commentaires

Est-ce que cette boîte de vers (si / elsesif jusqu'à ce que mes yeux saignent) la seule / meilleure solution?


Eh bien, c'est juste (heure> = 8) && (heure <16). Mais si vous souhaitez considérer les minutes aussi que vous souhaitez convertir la dateTime en une heure locale et utiliser les méthodes israter () et Isbefore (). Sentez-vous de la chance que votre heure ne soit pas de plus de minuit. J'ai eu cette tâche une fois et cela m'a donné mal à la tête! ;-)


Eh bien, j'ai fini par le faire comme ça, malheureusement. Peut-être que Jodatime a obtenu un calendrier plus cohérent.Après () lors de la fixation de certains champs à zéro, mais je n'ai pas essayé cela. Force brute tout le chemin ...: p


Et après 2 heures de faire de cette façon, je suis revenu et j'ai trouvé la solution mod!


Cela semble guère comme le type de tâche qui exige une bibliothèque tierce.



2
votes

Si je vous ai bien compris, il vous suffit de normaliser vos dates à une valeur commune. Créez trois instances de calendrier - une avec votre temps, mais une journée, un mois et une année réglées à zéro, et deux avec le début et la fin de votre période, d'autres champs sont également mis à zéro. Ensuite, vous pouvez utiliser calendrier.Après () et calendrier.before () pour voir si la date est comprise entre la plage.


1 commentaires

J'ai fait des tests à ce sujet et avec le calendrier, j'ai eu des résultats incohérents. Même si je suis assis tout à 0, cela ne m'a donné rien je pourrais utiliser. J'ai fini par vérifier chaque valeur.



5
votes

Je pense que je comprends ce que vous voulez. Vous souhaitez tester n'importe quel jour, s'il est entre 8h et 16 heures UTC. Prenez l'horodatage mod 24 * 3600. Cela vous donnera le nombre de secondes écoulées dans la journée. Ensuite, vous comparez simplement que c'est entre 8 * 3600 et 16 * 3600. Si vous avez besoin de traiter des fuseaux horaires, les choses deviennent plus compliquées.


1 commentaires

Merci, une solution vraiment soignée à mon problème!