2016-06-22 9 views
3

Gibt es eine einfache Möglichkeit zu überprüfen, ob eine Variable/ein Objekt vom Typ Date/Time/DateTime ist? Ohne Benennung Alle ArtenWie überprüft man, ob Variable in Ruby Date oder Time oder DateTime ist?

+0

Warum wollen Sie es überprüfen? Einige von ihnen teilen Methoden, mit denen Sie sie verwenden können, ohne zu wissen, um welchen Typ es sich handelt? – Leito

+0

Ich habe einen aktiven Rails-Datensatz mit 2 Attributen, die Zeit sind. Ich muss eine '.map' erstellen, um jedes Attribut zu konvertieren, das Time to datetime ist. Wäre toll, dass in Zukunft die Art der Zeit in der DB geändert werden könnte, daher die Frage .. aber ich schätze ich bin jetzt nur ein bisschen neugierig ... – Aurimas

+0

Neugierig warum der Downvote? .. Gibt es eine Möglichkeit, die Leute zu fragen, die abgelehnt wurden? Ich muss jemanden wütend gemacht haben in diesem "Forum" – Aurimas

Antwort

6

Eine weitere Option:

def is_datetime(d) 
    d.methods.include? :strftime 
end 
+2

Danke für diese Antwort. Es führte mich zu dieser Lösung: 'd.respons_to? (: Strftime)' –

1

Ich glaube nicht, gibt es eine „einfache Möglichkeit,“ ohne Eingabe die alle Arten von Variationen Date/Time/DateTime/Timezone aus.

Die einfachste und schnellste Weg ist dateTime.is_a?(DateTime) oder Time.is_a?(Time), Wiederholung ad nausem zu tun - die alle einen boolean zurück.

Umgekehrt können Sie auch kind_of?.

Sie könnten auch einen Rahmen finden können, die eine Funktion hat, alle Variationen von Datum und Uhrzeit zu überprüfen.

3

Wenn Sie das Objekt überprüfen möchten, hier haben Sie ein paar Beispiele:

[email protected]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 

Auch ich denke, dass Time-Zone von Rails und nicht von Ruby.

Wie pro Ihren Kommentar, wenn Sie ein Time-Objekt zu Datetime konvertieren wollen denke ich, dass so etwas wie dies sollte es funktionieren:

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

Hier haben Sie einige Code:

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 

Hier können Sie haben einige interessante Informationen In Ruby on Rails, what's the difference between DateTime, Timestamp, Time and Date?

-3

hässlich, aber echte Lösung:

def is_datetime(d) 
    %w(Date Time DateTime Timezone).any? { |t| d.class.name == t } 
end 

Und Test:

d = Date.new # DateTime.new or Time.new or Time.zone 

is_datetime(d) # returns true 

es für alle 4 überprüft (einschließlich der Schienen Zeitzone)

+1

Dies wird für jede Klasse mit "Date" oder "Time" in ihrem Namen, z. 'NotADate' oder' Timeline'. –

+0

Ich habe die Antwort angepasst, bitte upvote, wer auch immer das abgelehnt hat. – Aurimas

3

Sie die Klasse eines Objekts prüfen kann

object.class 

tun es Datum zurückgeben sollte , String oder was auch immer es ist. Sie können tun, auch die umgekehrte und überprüfen, ob ein Objekt eine Instanz einer Klasse ist:

object.instance_of?(class) 

wo Klasse ist, die Sie überprüfen möchten (String, Datum), Rückkehr wahr/falsch

1

zu finden In welcher Klasse sich das Modul (oder die Methode) befindet, verwenden Sie die Funktion .class, mit der Sie Ruby-Objekte untersuchen können, um herauszufinden, in welcher Klasse sie sich befinden. Die Syntax dafür sieht folgendermaßen aus: object.class. Hier einige Beispiele:

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 

Wie Sie sehen dies ist eine einfache und einfache Möglichkeit, die Klasse zu finden, dass das Objekt in ist.

Verwandte Themen