pensez que vous voulez dire soustrayez la date de début de la date de fin :)
Nader
99
genre d'anticlimatique hein?
Brig
18
note: si vous utilisez Wirble dans irb (pour coloriser la sortie), le nombre rationnel aura un 1 concaténé à la fin. yikes! vous pouvez utiliser to_i pour convertir le résultat en entier
jwal
9
Si vous avez un DateTimeobjet, assurez-vous de le convertir en Datepremier, sinon il renvoie le nombre de secondes (je suppose).
Joshua Muheim
44
Notez également que la soustraction de deux Dateobjets vous donne un Rationalque vous devrez peut-être convertir en un entier, comme avec(endDate - beginDate).to_i
MusikAnimal
98
irb(main):005:0> a =Date.parse("12/1/2010")=>#<Date: 4911063/2,0,2299161>
irb(main):007:0> b =Date.parse("12/21/2010")=>#<Date: 4911103/2,0,2299161>
irb(main):016:0> c = b.mjd - a.mjd
=>20
La date julienne (JD) est l'intervalle de temps en jours et en fractions de jour depuis le 1er janvier 4713 avant JC Greenwich midi, calendrier prolptique julien.
The Range est un ensemble de séries uniques. Et ...c'est un littéral de gamme exclusif.
C'est beginDate..(endDate - 1)pareil. Sauf que non.
Dans le cas où beginDate est égal à endDate , le premier élément sera exclu en raison d'unicité et ...exclura le dernier. Donc, si nous voulons des .countdates entre aujourd'hui et aujourd'hui, il renverra 0.
C'est une très bonne réponse, si le beginDate est plus ancien que le endDate, il reviendra 0, ce qui fonctionne parfaitement dans certains cas. De plus, si les deux dates sont identiques, il renverra 0. Il renvoie également un entier brut. D'autres réponses doivent être transformées en entiers ou vous devrez peut-être traduire à 0 si le résultat est négatif.
Une information à signaler: DateTime.parse dans Ruby s'attend à ce que la date soit donnée sous la forme JJ / MM / AAAA ou JJ-MM-AAAA. En tant qu'Américain, ça me dérange toujours!
rickumali
15
@rickumali En tant que membre du reste du monde, je remercie Ruby d'avoir utilisé "notre" format de date par défaut.
Claudio Holanda
7
@rickumali Ruby accepte également la date au YYYY-MM-DDformat, ce que tout le monde devrait utiliser de toute façon.
La date est exprimée en jours, vous n'avez donc pas besoin de le faire. Je pense que votre solution devient pertinente avec les différences de DateTime.
suga_shane
1
Eh bien, faites attention à ce que vous entendez par «entre» aussi ...
days_apart =(to - from).to_i # from + days_apart = to
total_days =(to - from).to_i +1# number of "selected" days
in_between_days =(to - from).to_i -1# how many days are in between from and to, i.e. excluding those two days
DateTime
objet, assurez-vous de le convertir enDate
premier, sinon il renvoie le nombre de secondes (je suppose).Date
objets vous donne unRational
que vous devrez peut-être convertir en un entier, comme avec(endDate - beginDate).to_i
Cela utilise un numéro de jour julien modifié .
De wikipedia :
la source
Cela peut avoir changé dans Ruby 2.0
Quand je fais cela, j'obtiens une fraction. Par exemple sur la console (soit irb, soit rails c)
Bien sûr, la conversion en un int donne le résultat attendu
Cela fonctionne également pour les objets DateTime, mais vous devez prendre en compte les secondes, comme cet exemple
la source
Dans Ruby 2.1.3, les choses ont changé:
la source
Que dis-tu de ça?
The Range est un ensemble de séries uniques. Et
...
c'est un littéral de gamme exclusif.C'est
beginDate..(endDate - 1)
pareil. Sauf que non.Dans le cas où beginDate est égal à endDate , le premier élément sera exclu en raison d'unicité et
...
exclura le dernier. Donc, si nous voulons des.count
dates entre aujourd'hui et aujourd'hui, il renverra 0.la source
0
, ce qui fonctionne parfaitement dans certains cas. De plus, si les deux dates sont identiques, il renverra 0. Il renvoie également un entier brut. D'autres réponses doivent être transformées en entiers ou vous devrez peut-être traduire à 0 si le résultat est négatif.Cela a fonctionné pour moi:
la source
Essaye ça:
la source
tout cela m'a conduit au résultat correct, mais j'ai fini par faire
la source
YYYY-MM-DD
format, ce que tout le monde devrait utiliser de toute façon.jours = (endDate - beginDate) / (60 * 60 * 24)
la source
Eh bien, faites attention à ce que vous entendez par «entre» aussi ...
la source