Ruby 将日期转换为星期几

Ruby 将日期转换为星期几,ruby,switch-statement,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 d

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

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`

当发生以下情况时,使用之后的表达式检查案例之后的表达式:

daytime === (daytime.strftime('%A') == 'Monday')
# => nil
问题是,您试图将
白天
之后的
案例
之后的
时间
进行比较。因此,如果all
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在评论中提到的,最好用于您的目标。

检查
案例之后的表达式
之后的表达式,当发生以下情况时:

daytime === (daytime.strftime('%A') == 'Monday')
# => nil
问题是,您试图将
白天
之后的
案例
之后的
时间
进行比较。因此,如果all
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在评论中提到的那样,最好用于您的目标。

案例与
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

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

下面是一个更简洁的translate_date版本,如果Day参数恰好是字符串,它也会转换为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
这就解决了案例陈述的结构问题,并使其更易于阅读

这将输出以下内容:

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

下面是一个更简洁的translate_date版本,如果Day参数恰好是字符串,它也会转换为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
这就解决了案例陈述的结构问题,并使其更易于阅读

这将输出以下内容:

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

您可能想考虑使用国际化来实现这一点。您可能需要考虑使用国际化来实现这一点。有时会使用散列:
day_map={'Monday'=>'Poniedziałek',…}
,然后
day_map[day.strftime(“%a”)]
。解释得很好。有时会使用散列:
day_map={'Monday'=>'Poniedziałek',…}
,然后
day_map[day.strftime(“%a”)]
。您所做的“更好的方式”解决方案是非常优雅的Ruby。干得好@MichaelGaskill非常感谢您所做的“更好的方式”解决方案是非常优雅的Ruby。干得好@迈克尔:非常感谢