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:
Sometimes I don't always get the re开发者_JAVA技巧sult I want. For ex, I got a return time of -2700 hours.
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.
精彩评论