0
votes

Vérifiez si une plage de temps est comprise entre une autre plage de temps et combien d'heures de rubis sur rails

alors j'ai un start_time et end_time. Qui est maximum 24 heures. Je suppose que j'ai d'abord besoin de vérifier si ce Timerange est dans un autre Timérange Dites 21: 00-01: 00. Si c'est moi, j'ai besoin de savoir combien de heures se trouve dans le Timérange. Des idées?


0 commentaires

5 Réponses :


0
votes

Utilisation ((((deux-un) / 3600) / p>


0 commentaires

0
votes

Je suppose que les quatre arguments de la méthode ci-dessous sont des cordes de la forme "HH: mm" ou "HH: MM: SS". J'ai fourni une solution pure-rubis qui fait des comparaisons de chaîne uniquement (par exemple: "17:26" vrai code>). C'est-à-dire que je ne convertis pas les chaînes en horaire code>.

time_within_ref?("19:00", "02:00", "18:00", "03:00")
  #=> true 
time_within_ref?("19:00", "04:00", "18:00", "03:00")
  #=> false
time_within_ref?("17:00", "02:00", "18:00", "03:00")
  #=> false
time_within_ref?("18:00", "02:00", "18:00", "03:00")
  #=> true


0 commentaires

0
votes

Que voulez-vous dire par "dans"? Voulez-vous dire que vous souhaitez tester s'il y a un chevauchement entre les gammes ou si la première plage est entièrement contenue dans une autre?

Vous pouvez utiliser des objets de temps dans des gammes et exploit #cover? à Vérifiez que le chevauchement xxx

Si les deux extrémités de la plage sont couvertes par votre plage de chèques, votre plage est entièrement couverte. Si une seule extrémité est couverte, vous vous chevauchez. Si aucune fin n'est couverte, les gammes ne se croisent pas.

Une fois que vous savez s'il y a une intersection, vous pouvez alors calculer trivialement la distance d'une extrémité de la plage de temps à une extrémité de votre plage de chèques; Si vous voulez savoir combien de temps entre votre jeu de plage de chèques et votre heure de début d'entrée, soustrayez simplement start_time - check_range_start .


3 commentaires

Donc, un peu plus d'arrière-plan: j'ai besoin de passer dans une chaîne start_time et end_time pour un changement d'emploi. Qui peut avoir le maximum de 24 heures. Ensuite, je veux vérifier si ces deux tombent dans une minuterie prédestinée de 20:00 et 01h00. Donc, si un changement est de 12h00-19: 00 son faux. Et 12: 00-21: 00 = true ou 21: 00-03: 00 = vrai


Jusqu'à présent, j'ai ceci: mais ne semble pas fonctionner. start_time.strfTime ("% h:% m")> = '20: 00'.TO_Time && '01: 00'.TO_Time <= end_time.strftime ("% h:% m")


StrfTime transforme un objet de temps dans une chaîne. Assurez-vous que vous comparez du temps en temps, pas de temps à la chaîne.



0
votes

Il existe plusieurs façons de l'exécuter dans la base de données qui sont beaucoup plus performantes que de charger un tas d'enregistrements dans des rails.

tandis que "PURE RUBY" Solutions est une solution rapide, ils épuiseront la mémoire disponible et écrivez votre serveur. Compte tenu d'une quantité non triviale d'enregistrements.

Vous pouvez utiliser une plage avec .where pour créer un où start_time entre a et b clause assure qu'un temps est dans A et b. xxx

si vous souhaitez vous assurer que toute la portée entre start_time et end_time se trouve dans un ensemble de limites que vous pouvez vous écrire Pile où la clause: xxx

J'ai besoin de savoir combien de heures se trouve dans le Timérange.

Vous pouvez le faire avec les fonctions de temps / date dans votre base de données. Sur Postgres, par exemple, vous pouvez faire: xxx

à nouveau calculer cela dans la DB est vital si vous voulez par exemple utiliser ceci dans une clause WHERE.


6 commentaires

Donc, un peu plus d'arrière-plan: j'ai besoin de passer dans une chaîne start_time et end_time pour un changement d'emploi. Qui peut avoir le maximum de 24 heures. Ensuite, je veux vérifier si ces deux tombent dans une minuterie prédestinée de 20:00 et 01h00. Donc, si un changement est de 12h00-19: 00 son faux. Et 12: 00-21: 00 = true ou 21: 00-03: 00 = vrai


Jusqu'à présent, j'ai ceci: mais ne semble pas fonctionner. start_time.strfTime ("% h:% m")> = '20: 00'.TO_Time && '01: 00'.TO_Time <= end_time.strftime ("% h:% m")


Vous pouvez faire quelque chose comme où un entre start_time et end_time et b entre start_time et end_time .


Dans Aciverecord, vous pouvez écrire la requête comme Modèle.Où (': A entre start_time et End_time and: B entre Start_Time et End_time', A: Predesinated_Range.Start, B: Predesinated_range.end)


Donc c'est dans le modèle que je fais ça. Je crée un changement de travail où start_time est x et end_time est x. Si cela tombe dans la minuterie prédestinée entre 20: 00-01: 00, je voudrais par exemple ajouter un montant à quelque chose. Donc, fondamentalement comme: si start_time.strfTime ("% h:% m")> = '20: 00'.Te_time && '01: 00'.Te_Time <= fin_time.strftime ("% h:% m" ) sinon quelque chose finir


Désolé peut-être plus facile à lire: si shift.start_time.strftime ("% h:% m")> = '20: 00'.Te_time && '01: 00'.Tour_time <= shift.end_time.trftime (" % H:% m ") faire quelque chose d'autre fait quelque chose de fin sur



0
votes

Je pense que je l'ai compris. shift.start_time.strftime ("% h:% m") => '20: 00 '&& shift.end_time.strfTime ("% h:% m") <= '01: 00' Le .to_time était en train de jouer avec moi et aussi la commande.


0 commentaires