当前位置:  开发笔记 > 后端 > 正文

Rails ActiveSupport时间解析?

如何解决《RailsActiveSupport时间解析?》经验,为你挑选了2个好方法。

Rails的ActiveSupport模块使用许多方法扩展了内置的ruby Time类.

值得注意的是,有一种to_formatted_s方法,它允许您编写Time.now.to_formatted_s(:db)以获取数据库格式的字符串,而不是必须在strftime任何地方编写丑陋的格式字符串.

我的问题是,有没有办法倒退?

类似于Time.parse_formatted_s(:db)解析数据库格式的字符串,返回一个新的Time对象.这似乎是rails应该提供的东西,但如果是,我找不到它.

我只是无法找到它,或者我是否需要自己编写?

谢谢



1> Tyler Rick..:

看起来ActiveSupport确实提供了你正在寻找的解析方法(毕竟我也在寻找)!- 至少如果您尝试解析的字符串是标准的ISO-8601格式(:db格式)日期.

如果您尝试解析的日期已经在您当地的时区,那真的很容易!

 > Time.zone.parse('2009-09-24 08:28:43')
=> Thu, 24 Sep 2009 08:28:43 PDT -07:00

 > Time.zone.parse('2009-09-24 08:28:43').class
=> ActiveSupport::TimeWithZone

然后可以轻松地将时区感知时间转换为UTC

 > Time.zone.parse('2009-09-24 08:28:43').utc
=> 2009-09-24 15:28:43 UTC

或到其他时区:

 > ActiveSupport::TimeZone.us_zones.map(&:name)
=> ["Hawaii", "Alaska", "Pacific Time (US & Canada)", "Arizona", "Mountain Time (US & Canada)", "Central Time (US & Canada)", "Eastern Time (US & Canada)", "Indiana (East)"]

 > Time.zone.parse('2009-09-24 08:28:43').utc.in_time_zone('Eastern Time (US & Canada)')
=> Thu, 24 Sep 2009 11:28:43 EDT -04:00

如果您尝试解析的日期字符串是UTC,另一方面,看起来没有任何方法可以直接将其解析为TimeWithZone,但我能够解决这个问题,首先使用DateTime.strptime ...

如果您尝试解析的日期是UTC,并且您希望它保持为UTC,则可以使用:

 > DateTime.strptime('2009-09-24 08:28:43', '%Y-%m-%d %H:%M:%S').to_time
=> 2009-09-24 08:28:43 UTC

如果您尝试解析的日期是UTC,并且您希望将其转换为默认时区,则可以使用:

 > DateTime.strptime('2009-09-24 08:28:43', '%Y-%m-%d %H:%M:%S').to_time.in_time_zone
=> Thu, 24 Sep 2009 01:28:43 PDT -07:00

看起来它甚至可以解析其他格式,例如Time#to_s产生的奇怪格式:

irb -> Time.zone.parse('Wed, 23 Sep 2009 02:18:08').to_s(:db)
    => "2009-09-23 09:18:08"

irb -> Time.zone.parse('Wed, 23 Sep 2009 02:18:08 EDT').to_s(:db)
    => "2009-09-23 06:18:08"

我印象非常深刻.

以下是[ http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html] [1 ]中的更多示例:

  Time.zone = 'Eastern Time (US & Canada)'        # => 'Eastern Time (US & Canada)'
  Time.zone.local(2007, 2, 10, 15, 30, 45)        # => Sat, 10 Feb 2007 15:30:45 EST -05:00
  Time.zone.parse('2007-02-10 15:30:45')          # => Sat, 10 Feb 2007 15:30:45 EST -05:00
  Time.zone.at(1170361845)                        # => Sat, 10 Feb 2007 15:30:45 EST -05:00
  Time.zone.now                                   # => Sun, 18 May 2008 13:07:55 EDT -04:00
  Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone  # => Sat, 10 Feb 2007 15:30:45 EST -05:00

更多文档链接供参考:

http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html

http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html


谢谢你的回答!如果您不想更改全局TZ,可以使用Time :: use_zone,例如.解析UTC时,请使用Time.use_zone('UTC'){Time.zone.parse'2012-11-01 13:37'}.

2> Leventix..:
ActiveSupport::TimeZone.new('UTC').parse('2009-09-23 09:18:08')
=> Wed, 23 Sep 2009 09:18:08 UTC +00:00

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有