【问题标题】:Ruby/Rails - Convert Date/Time back into Natural Language (2011-02-17 => February 17th, 2011)Ruby/Rails - 将日期/时间转换回自然语言 (2011-02-17 => 2011 年 2 月 17 日)
【发布时间】: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 点”??

基本上与慢性病相反?

【问题讨论】:

    标签: ruby-on-rails datetime


    【解决方案1】:

    我很惊讶没有“慢性病的逆转”宝石,所以我写了一个。它适用于您的 ActiveRecord 对象。

    只需 gem install 并在 created_at 字段或任何其他具有 ActiveSupport::TimeWithZone 类的字段上调用“漂亮”方法。

    https://github.com/brettshollenberger/hublot

    【讨论】:

    • 这已经存在于 Rails 中。查看initializers/date_time_formats.rb - 那些指定可以传递给ActiveSupport::TimeWithZone#to_s 的格式。见Time#to_formatted_s。对于相对时间,有 time_ago_in_words 助手。
    • 在我看来,单词中的时间距离和单词中的时间之前提供了一个有用的短期解决方案,但不是一个有用的长期解决方案。 “5 个月前”或“2 年前”对您的用户来说不是有用的助手。宇舶表的默认设置预计像“上周一”这样的助手是用户在没有完全合格的情况下想要考虑时间的最远距离。在我看来,这是一个更好的用户体验。作为开发人员,我也尝试过预测开发人员使用模型数据的方式,并将帮助程序直接添加到 Rails 应用程序中最常用 DOTIW 和 TAIW 的字段中。
    【解决方案2】:

    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。

    【讨论】:

      【解决方案3】:

      看看 strftime,这是 Time 类的it's implementation 的链接。

      有了它,你应该能够得到日期来做任何你想做的事情:-)

      >> Time.now.strftime("%A, %B %d, %Y at %l%p")
      => "Thursday, February 17, 2011 at  5PM"
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-04
      • 2016-06-15
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多