重构一个复杂的日期方法

时间:2018-11-10 16:58:36

标签: ruby datetime

我的用户从日期选择器中选择一些日期,该日期选择器以以下格式保存日期:

“ 2019年5月5日”

我希望日期以以下格式显示:“ 6月5日,星期三”

我在Ruby的date方法上有点挣扎。我放在一起的这种方法是行得通的,但是我敢肯定,如果有人可以帮我把它修整到一行,那么我会更好地理解Ruby的date方法。

def friendly_date(input)
    orig_due_date = Date.strptime(input, "%m/%d/%Y")
    orig_due_date.strftime("%A, %B %e")
end

在此先感谢您的见解。

2 个答案:

答案 0 :(得分:3)

除了避免使用局部变量外,我看不到任何改善

def friendly_date(input)
    Date.strptime(input, "%m/%d/%Y").strftime("%A, %B %e")
end

答案 1 :(得分:2)

你可以写...

def friendly_date(input)
  Date.strptime(input, "%m/%d/%Y").strftime("%A, %B %e")
end

...但这不会有所改善。它执行两个操作,即解析和格式化,因此更容易理解为两行。将变量命名为date是一种改进,因为在此函数中,它只是一个日期。

def friendly_date(input)
  date = Date.strptime(input, "%m/%d/%Y")
  date.strftime("%A, %B %e")
end

一种简化代码的更好方法是让一个函数将日期选择器提供的内容解析为Date,而另一个函数格式化任何Date

def date_from_datepicker(from_datepicker)
  Date.strptime(input, "%m/%d/%Y")
end

def friendly_date(date)
  date.strftime("%A, %B %e")
end

现在,您具有将日期选择器格式转换为Date的通用功能。还有一个通用函数,可以将任何DateTime转换成您喜欢的格式。

现在,您将立即将日期选择器的输出标准化为Date,并仅在必要时将其转换为友好格式。通过尽可能长时间地成为Date对象,这将使处理所有日期变得更加容易。

input_date = date_from_datepicker(params['date'])

...work with it like any other Date...

puts friendly_date(input_date)

# And it works on any Date.
puts friendly_date(some_other_date)