2011-03-18 34 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 

正如你所看到的,這是方式更加複雜,什麼凱爾建議和幾個月正確計算的唯一收穫。