【发布时间】:2011-06-29 05:15:53
【问题描述】:
我知道 Chronic,用于将语言转换为数据库计算格式的自然语言解析器,但我想知道如何将这些数据转换回人类可以轻松理解的数据。
例如:
Chronic.parse('today') => 2011-02-17 17:30:00 -0500
那么有没有办法将“2011-02-18 20:00:00”表示为“2011 年 2 月 18 日星期五晚上 10 点”??
基本上与慢性病相反?
【问题讨论】:
我知道 Chronic,用于将语言转换为数据库计算格式的自然语言解析器,但我想知道如何将这些数据转换回人类可以轻松理解的数据。
例如:
Chronic.parse('today') => 2011-02-17 17:30:00 -0500
那么有没有办法将“2011-02-18 20:00:00”表示为“2011 年 2 月 18 日星期五晚上 10 点”??
基本上与慢性病相反?
【问题讨论】:
我很惊讶没有“慢性病的逆转”宝石,所以我写了一个。它适用于您的 ActiveRecord 对象。
只需 gem install 并在 created_at 字段或任何其他具有 ActiveSupport::TimeWithZone 类的字段上调用“漂亮”方法。
【讨论】:
initializers/date_time_formats.rb - 那些指定可以传递给ActiveSupport::TimeWithZone#to_s 的格式。见Time#to_formatted_s。对于相对时间,有 time_ago_in_words 助手。
http://api.rubyonrails.org/classes/DateTime.html#method-i-to_formatted_s
如果您想获取当前日期和时间,只需执行以下操作:
Time.current.to_formatted_s(:long_ordinal)
得到:
February 17th, 2011 12:16
如果您想编写自己的格式,API 会在该链接中显示如何执行此操作。以下是可用格式的列表:
%a weekday name.
%A weekday name (full).
%b month name.
%B month name (full).
%c date and time (locale)
%d day of month [01,31].
%H hour [00,23].
%I hour [01,12].
%j day of year [001,366].
%m month [01,12].
%M minute [00,59].
%p AM or PM
%S Second [00,61]
%U week of year (Sunday)[00,53].
w weekday [0(Sunday),6].
W week of year (Monday)[00,53].
x date (locale).
%X time (locale).
%y year [00,99].
%Y year [2000].
%Z timezone name.
我推荐 to_formatted_s 而不是 strftime 的唯一原因是因为有了一个好的 config/initializers/time_formats.rb,你可以保持你的视图 DRYer。
【讨论】:
看看 strftime,这是 Time 类的it's implementation 的链接。
有了它,你应该能够得到日期来做任何你想做的事情:-)
>> Time.now.strftime("%A, %B %d, %Y at %l%p")
=> "Thursday, February 17, 2011 at 5PM"
【讨论】: