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」は気に入らないようです。この日付を解析するにはどうすればよいですか?
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」は気に入らないようです。この日付を解析するにはどうすればよいですか?
使用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
Time.parse( "2011-05-21 04:20:46.011"、 "%Y-%m-%d%H:%M:%S。%3N")を試してください
RailsコンソールでRubyv2.3.2およびRailsv5.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())をAPIの一部として提供し、ソースコードに示されているようにActiveSupport::TimeZone
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
コアチームの誰かが観察されたこの動作について明確にできることを願っています。動作が正常である場合は、少なくともドキュメントに注意を払う必要があります。