翻译日期星期几的

问题描述:

我来翻译命名一周的天我的母语的方法:翻译日期星期几的

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

你可能要考虑使用国际化这一点。 –

检查表达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')]''。 –

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非常感谢 –

这里是一个稍微更紧凑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