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? P>
5 Réponses :
Utilisation ((((deux-un) / 3600) / p>
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
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 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. P> 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 #cover? Code> à Vérifiez que le chevauchement p>
start_time - check_range_start code>. p> p> p>
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") code>
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.
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. p>
Vous pouvez utiliser une plage avec si vous souhaitez vous assurer que toute la portée entre J'ai besoin de savoir combien de heures se trouve dans le Timérange. P>
BlockQuote> Vous pouvez le faire avec les fonctions de temps / date dans votre base de données.
Sur Postgres, par exemple, vous pouvez faire: p> à nouveau calculer cela dans la DB est vital si vous voulez par exemple utiliser ceci dans une clause WHERE. p> p> .where code> pour créer un
où start_time entre a et b code> clause assure qu'un temps est dans A et b. p>
start_time code> et
end_time Code> se trouve dans un ensemble de limites que vous pouvez vous écrire Pile où la clause: p>
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") code>
Vous pouvez faire quelque chose comme où un entre start_time et end_time et b entre start_time et end_time code>.
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) code>
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 code>
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 code>
Je pense que je l'ai compris.
shift.start_time.strftime ("% h:% m") => '20: 00 '&& shift.end_time.strfTime ("% h:% m") <= '01: 00' code>
Le .to_time était en train de jouer avec moi et aussi la commande. p>