【问题标题】:Converting a date string into a time zone specific format将日期字符串转换为时区特定格式
【发布时间】:2020-01-20 22:47:41
【问题描述】:
Rails 5.2.3

我有个约会:

"Apr-03-2013 17:47:00"

我有一个约会区:

"America/Los_Angeles"

我正在尝试把它变成一个字符串:

"Apr-03-2013 17:47:00 Pacific Daylight Time (GMT-07)"

我能想到的最好的是:

time_obj = ActiveSupport::TimeZone["America/Los_Angeles"].parse("2013-04-03 17:47:00")
Time.at(time_obj).strftime("%b-%d-%Y %H:%M:%S %Z")

这给了我:

"Apr-03-2013 17:47:00 PDT"

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5


    【解决方案1】:

    我相信您需要自定义逻辑和/或您自己的时区数据库才能获得完全一样的信息。

    %Zstrftime 一起使用将为您提供操作系统所喜欢的任何内容,并且ruby docs 中有一些免责声明。

    您可能会从中获得一些好处:如果您以“America/Los_Angeles”之类的时区标识符开头,那么您可以使用 ActiveSupport::TimeZone::MAPPING 来获得一个更友好的名称,或者至少是一个Rails 时区名称。

    例如:

    ActiveSupport::TimeZone::MAPPING.key("America/Los_Angeles")
    => "Pacific Time (US & Canada)"
    

    但这不适用于每个标识符:

    ActiveSupport::TimeZone::MAPPING.key("America/Detroit")
    => nil
    

    你可以看到哪些会像这样映射:

    TZInfo::Country.get('US').zone_identifiers.map {|ident| [ident, ActiveSupport::TimeZone::MAPPING.key(ident)] }
    

    所以在这种情况下,您需要回退到您拥有的标识符,或者this approach 可能会起作用。

    然后你需要处理夏令时部分,这里你可以使用dst?

    ActiveSupport::TimeZone["America/Los_Angeles"].parse("2013-04-03 17:47:00").dst?
    

    那么您需要将所有这些拼接在一起! ...并添加偏移量。

    【讨论】:

    • 这是我正在考虑的事情之一,但我的问题实际上是是否存在现有功能,以便以不那么复杂的方式完成这项工作
    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2020-08-10
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多