How to check if variable is Date or Time or DateTime in Ruby?
检查变量/对象是否为
另一种选择:
1 2 3 | def is_datetime(d) d.methods.include? :strftime end |
。
您可以检查对象的类
1 | object.class |
。
它应该返回日期、字符串或其他内容。您还可以执行相反的操作,并检查对象是否是类的实例:
1 | object.instance_of?(class) |
。
其中class是要检查的类(字符串、日期),返回true/false
如果要验证对象,这里有几个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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 |
另外,我认为时区来自Rails,而不是Ruby。
根据您的评论,如果您想将时间对象转换为datetime,我认为类似这样的方法应该有效:
1 2 3 4 | def time_to_datetime time return time.to_datetime if time.instance_of?(Time) false end |
号
这里有一些代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
在RubyonRails中有一些有趣的信息,日期时间、时间戳、时间和日期之间有什么区别?
为了完成任务,另一个选择是:
1 2 3 | def responds_to_datetime?(date) true if date.to_datetime rescue false end |
。
然后,可以使用列和列哈希返回的列对象来获取数据类型和默认值等信息,例如:
1 2 3 4 5 6 | User.columns_hash['email'].type => :string User.columns_hash['email'].default => nil User.columns_hash['email'].sql_type =>"varchar(255)" |
(来源)
要找到模块(或方法)所在的类,可以使用
1 2 3 4 5 6 7 8 9 10 | 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 2 3 | def is_datetime(d) %w(Date Time DateTime Timezone).any? { |t| d.class.name == t } end |
。
并测试:
1 2 3 | d = Date.new # DateTime.new or Time.new or Time.zone is_datetime(d) # returns true |
它检查所有4个(包括Rails时区)