Действительно ли возможно создать список месяцев между двумя датами в направляющих

Многие ответы сосредоточены на том, как заставить ваше решение работать, в то время как очень немногие предполагают, что ваше решение - очень плохой подход . Если вы действительно хотите «практиковаться, чтобы учиться», почему бы не практиковаться, используя хорошие решения? Жесткое кодирование вашего пароля изучает неправильный подход!

Если вы действительно хотите получить пароль без пароля mount для этого тома, возможно, sudo не требуется в все ! Могу ли я предложить другие подходы?

  • Использовать /etc/fstab как mensi . Используйте опции user и noauto, чтобы позволить обычным пользователям монтировать этот том.

  • Используйте Polkit для действий без пароля: настройте файл .policy для своего скрипта с помощью yes и перейдите в /usr/share/polkit-1/actions

  • Редактируйте /etc/sudoers для разрешите вашему пользователю использовать sudo без ввода пароля.

Все вышеперечисленное допускает привилегии root без пароля, ни одно из них не требует от вас жесткого пароля. Выберите любой подход, и я могу объяснить его более подробно.

Что касается , почему очень плохая идея жестко кодировать пароли, вот несколько хороших ссылок для дальнейшего чтения:

10
задан 29 May 2009 в 13:18
поделиться

3 ответа

Просто поместите то, что вы хотите, в цикл диапазона и используйте массив Date :: MONTHNAMES, например,

(date.year..laterdate.year).each do |y|
   mo_start = (date.year == y) ? date.month : 1
   mo_end = (laterdate.year == y) ? laterdate.month : 12

   (mo_start..mo_end).each do |m|  
       puts Date::MONTHNAMES[m]
   end
end
34
ответ дан 3 December 2019 в 13:44
поделиться

Следующий код добавит метод экземпляра month_between к классу Date

#!/usr/bin/ruby 

require 'date'

class Date

  def self.months_between(d1, d2)
    months = []
    start_date = Date.civil(d1.year, d1.month, 1)
    end_date = Date.civil(d2.year, d2.month, 1)

    raise ArgumentError unless d1 <= d2

    while (start_date < end_date)
      months << start_date
      start_date = start_date >>1
    end

    months << end_date

  end
end

. Это ОЧЕНЬ мало проверено, однако он возвращает массив дат, каждая дата является 1-м днем ​​каждого затронутого месяца.

6
ответ дан 3 December 2019 в 13:44
поделиться

Я не знаю, полностью ли я понял вашу проблему, но некоторые из следующего могут быть полезны. Я воспользовался преимуществами расширений Date, представленных в ActiveSupport:

d1 = Date.parse("20070617") # => Sun, 17 Jun 2007
d2 = Date.parse("20090529") #=> Fri, 29 May 2009
eom = d1.end_of_month #=> Sat, 30 Jun 2007
mth_ends = [eom] #=> [Sat, 30 Jun 2007]
while eom < d2
  eom = eom.advance(:days => 1).end_of_month
  mth_ends << eom
end
yrs = mth_ends.group_by{|me| me.year}

В последней строке используется еще одно удобное расширение: Array # group_by, которое делает в значительной степени именно то, что обещает.

d1.year.upto(d2.year) do |yr|
  puts "#{yrs[yr].min}, #{yrs[yr].max}"
end
2007-06-30, 2007-12-31
2008-01-31, 2008-12-31
2009-01-31, 2009-05-31

Я не знаю, есть ли start / конечные точки соответствуют желанию, но вы сможете понять, что еще вам может понадобиться.

HTH

2
ответ дан 3 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: