2015-09-29 77 views
1

我想用相對的詞語顯示結束時間,例如「你還有2個小時才能回答投票」。是時間點:在一小時內,在今天內,明天晚於明天還是過去?

下面有什麼問題?當有例如還剩54分鐘,它返回「54小時」。

minute_diff = ((datetime_value - DateTime.current) * 24 * 60).to_i 

    case 
    when minute_diff < 0 # past time 
     [nil, "closed"] 
    when minute_diff.between?(0, 59) # within an hour 
     [minute_diff, "minutes"] 
    when datetime_value.today? # today 
     number_of_hours = (minute_diff/60) 
     [number_of_hours, "hours"] 
    when datetime_value.to_date == DateTime.current.tomorrow.to_date # tomorrow 
     [1, "day"] 
    when datetime_value.to_date > DateTime.current.tomorrow.to_date # later than tomorrow 
     number_of_days = (datetime_value.to_date - DateTime.current.to_date).to_i 
     [number_of_days, "days"] 
    end 

(上一個更好的方式來回報相對時間的建議,非常感謝)

+1

「剩下2個小時」沒有意義,語法上,所以很難提供建議。這些可能是你正在尋找的東西。 http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html –

+0

@MaxWilliams好吧,現在的措辭已經糾正。是的,我知道DateHelper,但沒有發現它足夠我的情況。 – Numbers

+0

你想在過去打印什麼? –

回答

3

關於你提到的第二個問題(給人一種更好的方法),你應該使用什麼是已經存在。

if (t = DateTime.current) < datetime_value 
    "You have #{distance_of_time_in_words(t, datetime_value)} left to answer the poll". 
else 
    "Closed" 
end 

如果要處理l18n,我最喜歡的是"twitter-cldr" gem

+0

有沒有什麼辦法可以將I18n應用於此,因爲返回值是單個字符串? – Numbers

2

我認爲rails的日期助手是足夠的。

if datetime_value > 0 
    s = "You have #{time_ago_in_words(datetime_value)} left to answer the poll" 
else 
    s = "Closed" 
end 
+0

這些助手的問題是,它很難翻譯,因爲返回的值是一個單一的字符串:(這就是爲什麼我分別返回時間單位的時間值和名稱,但因爲我沒有提到有關I18n在問題中,你的回答確實是正確的 – Numbers

+0

我猜'datetime_value> 0'總是'true',對吧? – sawa

+1

雖然它們不難翻譯,http://guides.rubyonrails.org/i18n。 HTML#概述 - 的 - 其他 - 內置的方法 - 即,提供-國際化支持 –

相關問題