2016-05-16 2 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 

Проблема заключается в том, что вы пытаетесь сравнить daytime после case с nil после 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

Хорошо объяснил. Иногда вместо этого используется хеш: '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 
Смежные вопросы