开发者

Custom function for converting unit of time

I have the following custom function for converting hours into unit of time:

  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

I am having two issues:

  1. Sometimes I don't always get the re开发者_JAVA技巧sult I want. For ex, I got a return time of -2700 hours.

  2. When the unit of time is months, I also want to return the days left as well. For example, 2 months and 13 days.


Assuming you're using a broad sense of the definition of a month (which isn't always 30 days, but it seems like your logic here isn't date-related)

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"


If you need to be a bit more strict with the months, you can use this code

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

As you can see, this is way more complex that what Kyle suggested and the only gain that the months are calculated properly.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜