将日期翻译为星期几

时间:2016-05-16 10:20:27

标签: ruby switch-statement

我有一种方法可以将一周的命名天数翻译成我的母语:

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 个答案:

答案 0 :(得分:5)

使用case之后的表达式检查when后的表达式,如下所示:

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

问题在于您尝试在daytime之后将casenil之后的when进行比较。因此,如果所有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 :(得分:2)

Caseif不同 如果你想使用案例方法,那就像这样使用它

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

答案 2 :(得分:0)

这是一个稍微紧凑的translate_date版本,如果daytime参数恰好是String,它也会转换为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