acho que você quer dizer subtrair a data de início a partir da data de término :)
Nader
99
tipo de anticlímax eh?
Brig
18
nota: se você estiver usando Wirble no irb (para colorir a saída), o número racional terá 1 concatenado até o final. caramba! você pode usar to_i para converter o resultado em um número inteiro
jwal
9
Se você tiver um DateTimeobjeto, certifique-se de converter para o Dateprimeiro; caso contrário, ele retornará o número de segundos (eu acho).
Joshua Muheim
44
Observe também subtraindo dois Dateobjetos lhe dá uma Rationalque você pode precisar de typecast em um número inteiro, como com(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
A data juliana (JD) é o intervalo de tempo em dias e frações de um dia desde 1º de janeiro de 4713 aC Greenwich ao meio-dia, calendário pré-séptico juliano.
O intervalo é um conjunto de seriados exclusivos. E ...é um literal exclusivo Range.
Então beginDate..(endDate - 1)é o mesmo. Exceto que não é.
No caso em que beginDate for igual a endDate , o primeiro elemento será excluído devido à exclusividade e ...o último. Portanto, se queremos .countdatas entre hoje e hoje, retornará 0.
Essa é uma resposta muito boa, se o beginDate for mais antigo que o endDate, ele retornará 0, o que funcionará perfeitamente em alguns casos. Além disso, se as duas datas forem iguais, ele retornará 0. Ele também retornará um número inteiro simples. Outras respostas precisam ser transformadas em números inteiros ou talvez você precise traduzir para 0 se o resultado for negativo.
Um detalhe a destacar: DateTime.parse no Ruby espera que a data seja dada como DD / MM / AAAA ou DD-MM-AAAA. Como americano, isso sempre me impressiona!
Rickumali #
15
@rickumali Como membro do resto do mundo, agradeço ao Ruby por usar o "nosso" formato de data padrão.
Claudio Holanda
7
@rickumali Ruby também aceita a data no YYYY-MM-DDformato, que é o que todos deveriam estar usando de qualquer maneira.
user513951
1
dias = (data final - data inicial) / (60 * 60 * 24)
A data é em dias, portanto você não precisa fazer isso. Eu acho que sua solução se torna relevante com as diferenças de DateTime.
suga_shane
1
Bem, cuide do que você quer dizer com "entre" também ...
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
objeto, certifique-se de converter para oDate
primeiro; caso contrário, ele retornará o número de segundos (eu acho).Date
objetos lhe dá umaRational
que você pode precisar de typecast em um número inteiro, como com(endDate - beginDate).to_i
Isso usa um número de dia juliano modificado .
Da wikipedia :
fonte
Isso pode ter mudado no Ruby 2.0
Quando faço isso, recebo uma fração. Por exemplo, no console (irb ou rails c)
Obviamente, converter para um int fornece o resultado esperado
Isso também funciona para objetos DateTime, mas você deve levar em consideração segundos, como este exemplo
fonte
No Ruby 2.1.3, as coisas mudaram:
fonte
Que tal agora?
O intervalo é um conjunto de seriados exclusivos. E
...
é um literal exclusivo Range.Então
beginDate..(endDate - 1)
é o mesmo. Exceto que não é.No caso em que beginDate for igual a endDate , o primeiro elemento será excluído devido à exclusividade e
...
o último. Portanto, se queremos.count
datas entre hoje e hoje, retornará 0.fonte
0
, o que funcionará perfeitamente em alguns casos. Além disso, se as duas datas forem iguais, ele retornará 0. Ele também retornará um número inteiro simples. Outras respostas precisam ser transformadas em números inteiros ou talvez você precise traduzir para 0 se o resultado for negativo.Isso funcionou para mim:
fonte
Tente o seguinte:
fonte
tudo isso me levou ao resultado correto, mas acabei fazendo
fonte
YYYY-MM-DD
formato, que é o que todos deveriam estar usando de qualquer maneira.dias = (data final - data inicial) / (60 * 60 * 24)
fonte
Bem, cuide do que você quer dizer com "entre" também ...
fonte