【问题标题】:Ruby on Rails 3 Time - Parse MillisecondsRuby on Rails 3 时间 - 解析毫秒
【发布时间】:2011-09-05 03:13:29
【问题描述】:

我正在尝试将如下日期:2011-05-21 04:20:46.011 解析为 Rails 中的 Time 对象。到目前为止,我有以下内容:

Time.strptime("2011-05-21 04:20:46.011", "%Y-%m-%d %H:%M:%S.%3N")

但它似乎不喜欢结尾的“%3N”。如何解析这个日期?

【问题讨论】:

    标签: ruby-on-rails ruby datetime time milliseconds


    【解决方案1】:

    使用parse:

    x = Time.parse("2011-05-21 04:20:46.011", "%Y-%m-%d %H:%M:%S.%3N")
    # => 2011-05-21 04:20:46 -0700
    x.usec
    # => 11000
    

    在许多情况下,您也不需要传递格式:

    x = Time.parse("2011-05-21 04:20:46.011")
    # => 2011-05-21 04:20:46 -0700
    x.usec
    # => 11000
    

    【讨论】:

    【解决方案2】:

    试试 Time.parse("2011-05-21 04:20:46.011", "%Y-%m-%d %H:%M:%S.%3N")

    【讨论】:

    • 我想我们同时回答了 :) 我猜这只是几秒钟的问题。但是您的回答提供了更多信息。我赞成它。
    【解决方案3】:

    在 Rails 控制台中使用 Ruby v 2.3.2Rails v 5.0.0.1

    2.3.2 :035 > Time.parse("2011-05-21 04:20:46.011", "%Y-%m-%d %H:%M:%S.%3N")
    NoMethodError: undefined method `getlocal' for "%Y-%m-%d %H:%M:%S.%3N":String
        from /home/jignesh/.rvm/rubies/ruby-2.3.2/lib/ruby/2.3.0/time.rb:264:in `make_time'
        from /home/jignesh/.rvm/rubies/ruby-2.3.2/lib/ruby/2.3.0/time.rb:366:in `parse'
        from (irb):35
    

    注意:在下面的解析格式代码中,不要在 %N 前面加上 %3N 这样的小数位数,而是简单地指定 %N 并且它可以工作

    2.3.2 :037 > Time.strptime("2011-05-21 04:20:46.011", "%Y-%m-%d %H:%M:%S.%N")
     => 2011-05-21 04:20:46 +0530 
    2.3.2 :038 > tt = Time.strptime("2011-05-21 04:20:46.011", "%Y-%m-%d %H:%M:%S.%N")
     => 2011-05-21 04:20:46 +0530 
    2.3.2 :039 > tt.usec
     => 11000 
    

    上述代码在使用parse时不起作用

    2.3.2 :040 > tt = Time.parse("2011-05-21 04:20:46.011", "%Y-%m-%d %H:%M:%S.%N")
    NoMethodError: undefined method `getlocal' for "%Y-%m-%d %H:%M:%S.%N":String
        from /home/jignesh/.rvm/rubies/ruby-2.3.2/lib/ruby/2.3.0/time.rb:264:in `make_time'
        from /home/jignesh/.rvm/rubies/ruby-2.3.2/lib/ruby/2.3.0/time.rb:366:in `parse'
        from (irb):40
    

    这看起来很奇怪,因为Time.strptime(date, format, now=self.now) 官方文档确实明确提到了%3N%6N%9N,并且在解析格式中使用它们不起作用!

    Rails 确实提供了对应的 strptime(str, format, now=now()) 作为 ActiveSupport::TimeZone API 的一部分,它在内部使用 Ruby 的标准 DateTime._strptime 进行解析,如其源代码所示:

    # File activesupport/lib/active_support/values/time_zone.rb, line 382
    def strptime(str, format, now=now())
      parts_to_time(DateTime._strptime(str, format), now)
    end
    

    我猜DateTime._strptime 在内部代表 Ruby 的标准 Time.strptime

    对于那些正在寻找利用 Rails 的 Time.zone.parse 对应项以特定格式进行解析的人,他们可以使用以下代码:

    tt = Time.zone.strptime('1999-12-31 14:00:00.011111', '%Y-%m-%d %H:%M:%S.%N')
     => Fri, 31 Dec 1999 14:00:00 UTC +00:00 
    2.3.2 :031 > tt.usec
     => 11111 
    

    希望核心团队的某个人能够澄清观察到的这种行为,如果这种行为是正常的,那么至少应该在文档中做一个说明。

    【讨论】:

    • 对不起@m1keil 我后来没有追究。我发布这个答案已经一年多了,因此无法回忆我在答案中尝试发布的代码的上下文。
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 2012-04-30
    • 2019-09-09
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多