2011-03-18 32 views
0

单元的自定义功能,我已经转换成时间单位时间如下自定义函数:转换的时间

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天。

+0

keruilin,逻辑是有点错误,因为你认为每个月是30天长。我会玩一些代码并发布一个答案 – Augusto 2011-03-18 11:02:51

回答

0

假设你正在使用一个月的定义广义上(这并不总是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" 
0

如果你需要多一点严格的几个月里,你可以使用此代码

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 

正如你所看到的,这是方式更加复杂,什么凯尔建议和几个月正确计算的唯一收获。