土法煉鋼修改DateTime物件顯示距離現在的時間

##土法煉鋼修改DateTime物件顯示距離現在的時間
date: 2009-02-13

現在看這篇覺得有點蠢,rails的helper裡已經有distance_of_time_in_words, distance_of_time_in_words_to_now以及time_ago_in_words

今天下午用土法煉鋼的方法寫了一個針對DateTime物件距離現在時間有多久的功能,這個功能是針對Rails網頁寫的,必須放在Helper的目錄下面才會有作用,如果是Ruby要用的話記得把pluralize方法拿掉,直接在單位上面加上”s”,pluralize是Rails裡的Active Support才有方法;如果要改成中文格式就不會有那麼多判斷式了,因為不需要去判斷時間單位有沒有複數的問題,當然這樣的寫法還有很大的進步空間,畢竟我也是程式的初學者,現在的目標是只要能達到想要的效果,程式的執行速度與寫作的優雅完全不列入考慮,大家參考看看嘍^^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#Calculate the time from the DateTime object to Now
#Converts a DateTime object to a string
def from_ago(datetime) #返回String類別
gap = Time.now - datetime #計算時間差,以秒為單位
if gap <= 0 #萬一這個物件是未來時間的話
return "In the future!" #返回在"未來發生"
end
day = (gap / (60 * 60 * 24)).floor # 時間差(秒)除以60秒X60分X24小時,去掉小數位就是天數 hour = ((gap / (60 * 60)) - (day * 24)).floor #扣掉天數後的小時數
minute = ((gap / 60) - (day * 24 * 60) - (hour * 60)).floor #扣掉天數與小時數後的分數
#second = (gap - (minute * 60) - (hour * 60 * 60) - (day * 24 * 60 * 60)).floor # 如果要用秒數的話
s_year = " year" # 設定單位,其實也可以直接在結果輸出,但這樣做可以針對不同語言修改s_day = " day" #同上
s_hour = " hour" #同上
s_minute = " minute" #同上
#s_second = "second" # 同上,要用秒數時再開啟吧
if day == 0 #開始判斷並輸出結果
if hour == 0 # 我討厭英文,因為還要注意單位的複數,另外要注意這邊用的是pluralize方法來改變單位
return minute.to_s + s_minute.pluralize + " ago"
elsif hour == 1
return hour.to_s + s_hour + " " + minute.to_s + s_minute.pluralize + " ago"
else
return hour.to_s + s_hour.pluralize + " " + minute.to_s + s_minute.pluralize + " ago"
end
elsif day == 1
if hour == 0
return day.to_s + s_day + " ago"
elsif hour == 1
return day.to_s + s_day + " and " + hour.to_s + s_hour + " ago"
else
return day.to_s + s_day + " and " + hour.to_s + s_hour.pluralize + " ago"
end
elsif day <>= 2 #一年內的判斷
if hour == 0
return day.to_s + s_day.pluralize + " ago"
elsif hour == 1
return day.to_s + s_day.pluralize + " and " + hour.to_s + s_hour + " ago"
else
return day.to_s + s_day.pluralize + " and " + hour.to_s + s_hour.pluralize + " ago"
end
elsif day >= 365 # 超過一年時
if (day / 365) == 1
day = day - 365
if day <= 1
return "1" + s_year + " and " + day.to_s + s_day + " ago"
else
return "1" + s_year + " and " + day.to_s + s_day.pluralize + " ago"
end
else
year = (day / 365)
day = day - (365 * year)
if day <= 1
return year.to_s + s_year.pluralize + " and " + day.to_s + s_day + " ago"
else
return year.to_s + s_year.pluralize + " and " + day.to_s + s_day.pluralize + " ago"
end
end
end
end

這是土法煉鋼的爛寫法,僅供參考…