将日期字符串转换为特定于时区的格式

时间:2019-09-19 20:55:51

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

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"

有什么想法吗?

1 个答案:

答案 0 :(得分: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?

然后,您需要将所有这些拼接在一起! ...并加上偏移量。