Пользовательская функция для преобразования единицы времени - PullRequest
0 голосов
/ 18 марта 2011

У меня есть следующая пользовательская функция для преобразования часов в единицу времени:

  def time_expiry_text(time_expiry) # unit of time is hours
    time_expiry_text = ''

    if ( (time_expiry / 24) > 30 ) then # if more than 30 days use months as unit
      months = ( (time_expiry / 24) / 30 )
      time_expiry_text = months.to_s
      time_expiry_text += months == 1 ? ' month' : ' months'
    elsif time_expiry >= 24 then # if greater than or equal to 1 day or 24 hours use days as unit
      days = time_expiry / 24
      time_expiry_text = days.to_s
      time_expiry_text += days == 1 ? ' day' : ' days'
    else
      hours = time_expiry
      time_expiry_text = hours.to_s
      time_expiry_text += hours == 1 ? ' hour' : ' hours'
    end

    return time_expiry_text
  end

У меня две проблемы:

  1. Иногда я не всегда получаю желаемый результат. Например, я получил время возврата -2700 часов.

  2. Когда единица времени - месяцы, я также хочу вернуть оставшиеся дни. Например, 2 месяца и 13 дней.

Ответы [ 2 ]

0 голосов
/ 18 марта 2011

Если вам нужно быть более строгим с месяцами, вы можете использовать этот код

require 'date'

class MyDateCalculator
  def time_expiry_text(hours) # unit of time is hours
    time_expiry_text = ''

    if( hours < 24)
      time_expiry_text = format(hours, 'hour')
    else
      days = hours/24
      now = DateTime.now
      now_month = months_since_epoch now
      expiry_date = now.to_date + days
      expiry_month = months_since_epoch expiry_date
      months = expiry_month - now_month

      if months == 0 or (months == 1 and expiry_date.day < now.day)
        time_expiry_text = format(days, 'day')
      else
        time_expiry_text = format(months, 'month')
        if expiry_date >= now.to_date.next_month( months ) + 1
          extra_days = expiry_date - now.to_date.next_month( months ) 
          time_expiry_text += ' ' +time_expiry_text( extra_days.to_i * 24)
        end
      end
    end

    return time_expiry_text
  end

  private
  def format(number, unit)
    text = "#{number} #{unit}"
    number == 1 ? text : text+'s'
  end

  def months_since_epoch(date)
    return date.year * 12 + date.month
  end

end

Как видите, это намного сложнее, чем предлагал Кайл, и единственное преимущество, которое даетмесяцы рассчитаны правильно.

0 голосов
/ 18 марта 2011

Предполагая, что вы используете широкое понимание определения месяца (которое не всегда 30 дней, но кажется, что ваша логика здесь не связана с датой)

hours = 16530
=> 16530    
days = hours / 24 
=> 688 #days
extra_hours = hours % 24
=> 18 #hours (unallocated)
months = days/30 
=> 22 #months
extra_days = days % 30
=> 28 #days (unallocated)

string = ""

string += months.to_s + " months " if months 
string += extra_days.to_s + " days " if extra_days
string += extra_hours.to_S + " hours " if extra_hours
string.strip! #or string = string.strip

string
=> "22 months 28 days 18 hours"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...