web-dev-qa-db-ja.com

Rubyで変数が日付か時間か日付時刻かを確認するにはどうすればよいですか?

変数/オブジェクトがDate/Time/DateTimeタイプかどうかを確認する簡単な方法はありますか?すべてのタイプに名前を付けることなく

13
Aurimas

別のオプション:

def is_datetime(d)
  d.methods.include? :strftime
end
18
zeke

あなたはオブジェクトのクラスを調べることができます

object.class

それは日付、文字列またはそれが何であれ何でも返すはずです。また、逆を行って、オブジェクトがクラスのインスタンスであるかどうかを確認することもできます。

object.instance_of?(class)

ここで、クラスはチェックするもの(文字列、日付)で、true/falseを返します

4
Ronan Lopes

オブジェクトを検証したい場合は、ここにいくつかの例があります。

nisevi@nisevi ~:$ irb
irb(main):001:0> require "date"
=> true
irb(main):002:0> require "time"
=> true
irb(main):003:0> d = Date.new
=> #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)>
irb(main):004:0> dt = DateTime.new
=> #<DateTime: -4712-01-01T00:00:00+00:00 ((0j,0s,0n),+0s,2299161j)>  
irb(main):005:0> t = Time.new
=> 2016-06-22 21:33:09 +0200

irb(main):014:0> d.instance_of?(Date)
=> true
irb(main):015:0> d.instance_of?(DateTime)
=> false
irb(main):016:0> d.instance_of?(Time)
=> false
irb(main):017:0> dt.instance_of?(DateTime)
=> true
irb(main):018:0> dt.instance_of?(Time)
=> false
irb(main):019:0> dt.instance_of?(Date)
=> false
irb(main):020:0> t.instance_of?(Time)
=> true
irb(main):021:0> t.instance_of?(DateTime)
=> false
irb(main):022:0> t.instance_of?(Date)
=> false

また、TimeZoneは Rails からのものであり、Rubyからのものではないと思います。

あなたのコメントのとおり、TimeオブジェクトをDateTimeに変換したい場合は、次のように機能するはずです。

def time_to_datetime time
  return time.to_datetime if time.instance_of?(Time)
  false
end

ここにいくつかのコードがあります:

irb(main):026:0> t.instance_of?(Time)
=> true
irb(main):027:0> t.methods.sort.to_s
=> "[:!, :!=, :!~, :+, :-, :<, :<=, :<=>, :==, :===, :=~, :>, :>=, :__id__, :__send__, :asctime, :between?, :class, :clone, :ctime, :day, :define_singleton_method, :display, :dst?, :dup, :enum_for, :eql?, :equal?, :extend, :freeze, :friday?, :frozen?, :getgm, :getlocal, :getutc, :gmt?, :gmt_offset, :gmtime, :gmtoff, :hash, :hour, :httpdate, :inspect, :instance_eval, :instance_exec, :instance_of?, :instance_variable_defined?, :instance_variable_get, :instance_variable_set, :instance_variables, :is_a?, :isdst, :iso8601, :itself, :kind_of?, :localtime, :mday, :method, :methods, :min, :mon, :monday?, :month, :nil?, :nsec, :object_id, :private_methods, :protected_methods, :public_method, :public_methods, :public_send, :remove_instance_variable, :respond_to?, :rfc2822, :rfc822, :round, :saturday?, :sec, :send, :singleton_class, :singleton_method, :singleton_methods, :strftime, :subsec, :succ, :sunday?, :taint, :tainted?, :tap, :thursday?, :to_a, :to_date, :to_datetime, :to_enum, :to_f, :to_i, :to_r, :to_s, :to_time, :trust, :tuesday?, :tv_nsec, :tv_sec, :tv_usec, :untaint, :untrust, :untrusted?, :usec, :utc, :utc?, :utc_offset, :wday, :wednesday?, :xmlschema, :yday, :year, :zone]"
irb(main):028:0> t.to_datetime
=> #<DateTime: 2016-06-22T21:33:09+02:00 ((2457562j,70389s,767750206n),+7200s,2299161j)>
irb(main):029:0> t.instance_of?(Time)
=> true
irb(main):030:0> t.instance_of?(DateTime)
=> false
irb(main):031:0> tdt = t.to_datetime
=> #<DateTime: 2016-06-22T21:33:09+02:00 ((2457562j,70389s,767750206n),+7200s,2299161j)>
irb(main):032:0> tdt.instance_of?(Time)
=> false
irb(main):033:0> tdt.instance_of?(DateTime)
=> true

ここに興味深い情報があります In Ruby Railsでは、DateTime、Timestamp、Time、Dateの違いは何ですか?

3
nisevi

Rails 5.2+オブジェクトかどうかをテストできますis_a?

Date.today.is_a?(Date) # -> true
Date.today.is_a?(DateTime) # -> false
1
CamiloVA

次に、columnsおよびcolumns_hashによって返されるColumnオブジェクトを使用して、データ型やデフォルト値などの情報を取得できます。次に例を示します。

User.columns_hash['email'].type
=> :string
User.columns_hash['email'].default
=> nil
User.columns_hash['email'].sql_type
=> "varchar(255)"

ソース

1
wuyuedefeng

モジュール(またはメソッド)が配置されているクラスを見つけるには、.class関数を使用します。これにより、Rubyオブジェクトを検査して、それらが配置されているクラスを見つけることができます。これの構文は次のようになります:object.class。以下にいくつかの例を示します。

irb(main):001:0> require 'date'
=> true
irb(main):002:0> d = Date.today
=> #<Date: 2016-06-22 ((2457562j,0s,0n),+0s,2299161j)>
irb(main):003:0> t = Time.now
=> 2016-06-22 18:52:24 -0500
irb(main):004:0> t.class
=> Time
irb(main):005:0> d.class
=> Date

ご覧のとおり、これはオブジェクトが含まれているクラスを見つけるための簡単でシンプルな方法です。

1
13aal

Date/Time/DateTime/Timezone outのすべてのタイプのバリエーションを入力しないと、「簡単な方法」はないと思います。

最も簡単で最速の方法は、dateTime.is_a?(DateTime)またはTime.is_a?(Time)repeat ad nausemを実行することです。これらはすべてブール値を返します。

逆に、kind_of?.を使用することもできます

また、日付と時刻のすべてのバリエーションをチェックする機能を持つフレームワークを見つけることができる場合もあります。

1
robert.otherone

完了するために、別のオプションは次のとおりです。

def responds_to_datetime?(date)
  true if date.to_datetime rescue false
end
0