2016-05-16 142 views
1

我來翻譯命名一週的天我的母語的方法:翻譯日期星期幾的

def translate_date(daytime) 
    case daytime 
    when daytime.strftime('%A') == 'Monday' 
    'Poniedziałek' 
    when daytime.strftime('%A') == 'Tuesday' 
    'Wtorek' 
    when daytime.strftime('%A') == 'Wednesday' 
    'Środa' 
    when daytime.strftime('%A') == 'Thursday' 
    'Czwartek' 
    when daytime.strftime('%A') == 'Friday' 
    'Piątek' 
    when daytime.strftime('%A') == 'Saturday' 
    'Sobota' 
    when daytime.strftime('%A') == 'Sunday' 
    'Niedziela' 
    end 
end 

我使用它,例如爲:

date = Sat, 21 May 2016 00:00:00 UTC +00:00 
translate_date(date) # => nil 

在哪裏的問題這種方法?爲什麼它會返回nil

同時,我得到:

date.strftime('%A') == 'Saturday' # => true` 
+3

你可能要考慮使用國際化這一點。 –

回答

5

檢查表達case後表達when發生這樣的事情後:

daytime === (daytime.strftime('%A') == 'Monday') 
# => nil 

的問題是,你正在試圖case與後比較daytimewhennil。所以,如果全部when返回nil,所有表達式返回nil

使用case聲明正確:

def translate_date(daytime) 
    case daytime.strftime('%A') 
    when 'Monday' 
    'Poniedziałek' 
    when'Tuesday' 
    'Wtorek' 
    when 'Wednesday' 
    'Środa' 
    when 'Thursday' 
    'Czwartek' 
    when 'Friday' 
    'Piątek' 
    when 'Saturday' 
    'Sobota' 
    when 'Sunday' 
    'Niedziela' 
    end 
end 
date = Date.parse("Sat, 21 May 2016 00:00:00 UTC +00:00") 
# => Sat, 21 May 2016 
translate_date(date) 
# => "Sobota" 

而且,@AnthonyE在評論中提到的,最好使用internationalization爲你的目標。

+1

很好解釋。有時使用散列:'day_map = {'Monday'=>'Poniedziałek',...}',然後是'day_map [daytime.strftime('%A')]''。 –

2

Case是不是同樣喜歡if 如果你想使用情況的方法,因此使用這樣的

def translate_date(daytime) 
    case daytime.strftime('%A') 
    when 'Monday' 
     'Poniedziałek' 
    when 'Tuesday' 
     'Wtorek' 
    when 'Wednesday' 
     'Środa' 
    when 'Thursday' 
     'Czwartek' 
    when 'Friday' 
     'Piątek' 
    when 'Saturday' 
     'Sobota' 
    when 'Sunday' 
     'Niedziela' 
    end 
end 

但更好的方法是這樣的

DAYS_IN_PL = { 
    'Monday' => 'Poniedziałek', 
    'Tuesday' => 'Wtorek', 
    'Wednesday' => 'Środa', 
    'Thursday' => 'Czwartek', 
    'Friday' => 'Piątek', 
    'Saturday' => 'Sobota', 
    'Sunday' => 'Niedziela' 
} 

def translate_date(daytime) 
    DAYS_IN_PL[daytime.strftime('%A')] 
end 
+0

你做的「更好的方式」解決方案是非常優雅的Ruby。做得很好! –

+0

@MichaelGaskill非常感謝 –

0

這裏是一個稍微更緊湊translate_date,如果日間參數碰巧是字符串,它也會轉換爲DateTime:

require 'date' 

def translate_date(daytime) 
    daytime = DateTime.parse(daytime) if daytime.is_a?(String) 
    case daytime.strftime("%A") 
    when 'Monday' then 'Poniedziałek' 
    when 'Tuesday' then 'Wtorek' 
    when 'Wednesday' then 'Środa' 
    when 'Thursday' then 'Czwartek' 
    when 'Friday' then 'Piątek' 
    when 'Saturday' then 'Sobota' 
    when 'Sunday' then 'Niedziela' 
    end 
end 

current_date = DateTime.now 

20.times do |offset| 
    puts "#{current_date.strftime("%F")}: #{translate_date(current_date)}" 
    current_date = current_date.prev_day 
end 

這樣可以解決case語句的結構性問題,並且使其更易於閱讀。

這將輸出如下:

2016-05-16: Poniedziałek 
2016-05-15: Niedziela 
2016-05-14: Sobota 
2016-05-13: Piątek 
2016-05-12: Czwartek 
2016-05-11: Środa 
2016-05-10: Wtorek 
2016-05-09: Poniedziałek 
2016-05-08: Niedziela 
2016-05-07: Sobota 
2016-05-06: Piątek 
2016-05-05: Czwartek 
2016-05-04: Środa 
2016-05-03: Wtorek 
2016-05-02: Poniedziałek 
2016-05-01: Niedziela 
2016-04-30: Sobota 
2016-04-29: Piątek 
2016-04-28: Czwartek 
2016-04-27: Środa