首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails ActiveSupport时间解析?

Rails ActiveSupport时间解析?
EN

Stack Overflow用户
提问于 2008-12-09 23:52:56
回答 5查看 37.1K关注 0票数 31

Rails' ActiveSupport module extends the builtin ruby Time class with a number of methods.

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

我的问题是,有没有一种方法可以倒退?

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

是我找不到它,还是我需要自己写?

谢谢

EN

回答 5

Stack Overflow用户

发布于 2009-09-24 21:24:27

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

如果你想要解析的日期已经在你当地的时区,这真的很简单!

代码语言:javascript
运行
复制
 > 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

代码语言:javascript
运行
复制
 > Time.zone.parse('2009-09-24 08:28:43').utc
=> 2009-09-24 15:28:43 UTC

或其他时区:

代码语言:javascript
运行
复制
 > 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格式,则可以使用:

代码语言:javascript
运行
复制
 > DateTime.strptime('2009-09-24 08:28:43', '%Y-%m-%d %H:%M:%S').to_time
=> 2009-09-24 08:28:43 UTC

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

代码语言:javascript
运行
复制
 > 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生成的奇怪格式:

代码语言:javascript
运行
复制
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]的更多示例

代码语言:javascript
运行
复制
  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
票数 61
EN

Stack Overflow用户

发布于 2010-08-06 00:17:58

代码语言:javascript
运行
复制
ActiveSupport::TimeZone.new('UTC').parse('2009-09-23 09:18:08')
=> Wed, 23 Sep 2009 09:18:08 UTC +00:00
票数 5
EN

Stack Overflow用户

发布于 2016-02-07 14:36:48

Rails 5最终提供了strptime

代码语言:javascript
运行
复制
value = '1999-12-31 14:00:00'
format = '%Y-%m-%d %H:%M:%S'
Time.zone.strptime(value, format)
# => Fri, 31 Dec 1999 14:00:00 HST -10:00

ActiveSupport::TimeZone.all.sample.strptime(value, format)
# => Fri, 31 Dec 1999 14:00:00 GST +04:00
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/354657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档