думаю, вы имеете в виду вычесть дату начала из даты окончания :)
Надер,
101
вроде антиклимактический а?
Бриг
18
примечание: если вы используете Wirble в irb (для раскрашивания вывода), рациональное число будет иметь конкатенированную до конца 1. ой! вы можете использовать to_i для преобразования результата в целое число
jwal
9
Если у вас есть DateTimeобъект, обязательно Dateсначала конвертируйте в , иначе он вернет количество секунд (я думаю).
Джошуа Мухейм
45
также обратите внимание, что вычитание двух Dateобъектов дает вам, Rationalчто вам может потребоваться преобразовать (endDate - beginDate).to_i
тип
101
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
Range - это набор уникальных сериалов. И ...это эксклюзивный литерал Range.
Так то beginDate..(endDate - 1)же самое. За исключением того, что это не так.
В случае, если beginDate равно endDate , первый элемент будет исключен из-за уникальности и ...исключит последний. Поэтому, если мы хотим .countдатировать сегодня и сегодня, он вернет 0.
Это очень хороший ответ, если beginDate старше endDate, он вернется 0, что отлично работает в некоторых случаях. Кроме того, если две даты совпадают, возвращается 0. Он также возвращает простое целое число. Другие ответы необходимо преобразовать в целые числа, или вам, возможно, придется перевести в 0, если результат отрицательный.
Следует отметить один лакомый кусочек: DateTime.parse в Ruby ожидает, что дата будет указана как ДД / ММ / ГГГГ или ДД-ММ-ГГГГ. Меня как американца это всегда сбивает!
rickumali 02
15
@rickumali Как участник от остального мира, я благодарю Ruby за использование «нашего» формата даты по умолчанию.
Клаудио Холанда
7
@rickumali Ruby также принимает дату в YYYY-MM-DDформате, который в любом случае следует использовать.
Дата указывается в днях, поэтому вам не нужно этого делать. Я думаю, что ваше решение становится актуальным с различиями в DateTime.
suga_shane
1
Ну, позаботьтесь и о том, что вы подразумеваете под словом "между" ...
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
объект, обязательноDate
сначала конвертируйте в , иначе он вернет количество секунд (я думаю).Date
объектов дает вам,Rational
что вам может потребоваться преобразовать(endDate - beginDate).to_i
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
Здесь используется модифицированный номер дня по юлианскому календарю .
Из википедии :
источник
Это могло измениться в Ruby 2.0
Когда я это делаю, я получаю дробь. Например на консоли (irb или rails c)
2.0.0-p195 :005 > require 'date' => true 2.0.0-p195 :006 > a_date = Date.parse("25/12/2013") => #<Date: 2013-12-25 ((2456652j,0s,0n),+0s,2299161j)> 2.0.0-p195 :007 > b_date = Date.parse("10/12/2013") => #<Date: 2013-12-10 ((2456637j,0s,0n),+0s,2299161j)> 2.0.0-p195 :008 > a_date-b_date => (15/1)
Конечно, приведение к int дает ожидаемый результат
2.0.0-p195 :009 > (a_date-b_date).to_i => 15
Это также работает для объектов DateTime, но вы должны учитывать секунды, например, в этом примере
2.0.0-p195 :017 > a_date_time = DateTime.now => #<DateTime: 2013-12-31T12:23:03-08:00 ((2456658j,73383s,725757000n),-28800s,2299161j)> 2.0.0-p195 :018 > b_date_time = DateTime.now-20 => #<DateTime: 2013-12-11T12:23:06-08:00 ((2456638j,73386s,69998000n),-28800s,2299161j)> 2.0.0-p195 :019 > a_date_time - b_date_time => (1727997655759/86400000000) 2.0.0-p195 :020 > (a_date_time - b_date_time).to_i => 19 2.0.0-p195 :021 > c_date_time = a_date_time-20 => #<DateTime: 2013-12-11T12:23:03-08:00 ((2456638j,73383s,725757000n),-28800s,2299161j)> 2.0.0-p195 :022 > a_date_time - c_date_time => (20/1) 2.0.0-p195 :023 > (a_date_time - c_date_time).to_i => 20
источник
В Ruby 2.1.3 все изменилось:
> endDate = Date.new(2014, 1, 2) => #<Date: 2014-01-02 ((2456660j,0s,0n),+0s,2299161j)> > beginDate = Date.new(2014, 1, 1) => #<Date: 2014-01-01 ((2456659j,0s,0n),+0s,2299161j)> > days = endDate - beginDate => (1/1) > days.class => Rational > days.to_i => 1
источник
Как насчет этого?
Range - это набор уникальных сериалов. И
...
это эксклюзивный литерал Range.Так то
beginDate..(endDate - 1)
же самое. За исключением того, что это не так.В случае, если beginDate равно endDate , первый элемент будет исключен из-за уникальности и
...
исключит последний. Поэтому, если мы хотим.count
датировать сегодня и сегодня, он вернет 0.источник
0
, что отлично работает в некоторых случаях. Кроме того, если две даты совпадают, возвращается 0. Он также возвращает простое целое число. Другие ответы необходимо преобразовать в целые числа, или вам, возможно, придется перевести в 0, если результат отрицательный.Это сработало для меня:
источник
Попробуй это:
источник
все это привело меня к правильному результату, но в итоге я сделал
DateTime.now.mjd - DateTime.parse("01-01-1995").mjd
источник
YYYY-MM-DD
формате, который в любом случае следует использовать.days = (endDate - beginDate) / (60 * 60 * 24)
источник
Ну, позаботьтесь и о том, что вы подразумеваете под словом "между" ...
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
источник