class DateTime

DateTime

Eine Unterklasse von Date, die Datum, Stunde, Minute, Sekunde und Offset einfach handhabt.

DateTime Klasse wird als veraltet betrachtet. Verwenden Sie die Time Klasse.

DateTime berücksichtigt keine Schaltsekunden und verfolgt keine Sommerzeitregeln.

Ein DateTime Objekt wird erstellt mit DateTime::new, DateTime::jd, DateTime::ordinal, DateTime::commercial, DateTime::parse, DateTime::strptime, DateTime::now, Time#to_datetime, etc.

require 'date'

DateTime.new(2001,2,3,4,5,6)
                    #=> #<DateTime: 2001-02-03T04:05:06+00:00 ...>

Das letzte Element von Tag, Stunde, Minute oder Sekunde kann eine Bruchzahl sein. Die Präzision der Bruchzahl wird höchstens auf Nanosekunden angenommen.

DateTime.new(2001,2,3.5)
                    #=> #<DateTime: 2001-02-03T12:00:00+00:00 ...>

Ein optionales Argument, der Offset, gibt die Differenz zwischen der lokalen Zeit und UTC an. Zum Beispiel repräsentiert Rational(3,24) 3 Stunden vor UTC, Rational(-5,24) repräsentiert 5 Stunden hinter UTC. Der Offset sollte zwischen -1 und +1 liegen, und seine Präzision wird höchstens auf Sekunden angenommen. Der Standardwert ist Null (entspricht UTC).

DateTime.new(2001,2,3,4,5,6,Rational(3,24))
                    #=> #<DateTime: 2001-02-03T04:05:06+03:00 ...>

Der Offset akzeptiert auch String-Formate

DateTime.new(2001,2,3,4,5,6,'+03:00')
                    #=> #<DateTime: 2001-02-03T04:05:06+03:00 ...>

Ein optionales Argument, der Tag der Kalenderreform (start), bezeichnet eine Julianische Tageszahl, die zwischen 2298874 und 2426355 oder negativ/positiv unendlich liegen sollte. Der Standardwert ist Date::ITALY (2299161=1582-10-15).

Ein DateTime Objekt hat verschiedene Methoden. Siehe die jeweilige Referenz.

d = DateTime.parse('3rd Feb 2001 04:05:06+03:30')
                    #=> #<DateTime: 2001-02-03T04:05:06+03:30 ...>
d.hour              #=> 4
d.min               #=> 5
d.sec               #=> 6
d.offset            #=> (7/48)
d.zone              #=> "+03:30"
d += Rational('1.5')
                    #=> #<DateTime: 2001-02-04%16:05:06+03:30 ...>
d = d.new_offset('+09:00')
                    #=> #<DateTime: 2001-02-04%21:35:06+09:00 ...>
d.strftime('%I:%M:%S %p')
                    #=> "09:35:06 PM"
d > DateTime.new(1999)
                    #=> true

Wann sollte man DateTime verwenden und wann Time?

Es ist ein weit verbreiteter Irrtum, dass William Shakespeare und Miguel de Cervantes am selben Tag starben - so sehr, dass die UNESCO den 23. April zum Welttag des Buches erklärt hat. Da England jedoch den Gregorianischen Kalender noch nicht übernommen hatte (und dies erst 1752 tun sollte), liegen ihre Todesdaten tatsächlich 10 Tage auseinander. Da die Ruby Time Klasse einen proleptischen Gregorianischen Kalender implementiert und kein Konzept von Kalenderreformen hat, gibt es keine Möglichkeit, dies mit Time Objekten auszudrücken. Hier kommt DateTime ins Spiel.

shakespeare = DateTime.iso8601('1616-04-23', Date::ENGLAND)
 #=> Tue, 23 Apr 1616 00:00:00 +0000
cervantes = DateTime.iso8601('1616-04-23', Date::ITALY)
 #=> Sat, 23 Apr 1616 00:00:00 +0000

Man sieht schon, dass etwas seltsam ist - die Wochentage sind unterschiedlich. Gehen wir weiter

cervantes == shakespeare
 #=> false
(shakespeare - cervantes).to_i
 #=> 10

Dies zeigt, dass sie tatsächlich 10 Tage auseinander starben (in Wirklichkeit 11 Tage, da Cervantes einen Tag früher starb, aber am 23. beigesetzt wurde). Das tatsächliche Todesdatum von Shakespeare können wir sehen, indem wir die Methode gregorian verwenden, um es zu konvertieren.

shakespeare.gregorian
 #=> Tue, 03 May 1616 00:00:00 +0000

Es gibt also das Argument, dass all die Feierlichkeiten, die am 23. April in Stratford-upon-Avon stattfinden, eigentlich das falsche Datum sind, da England jetzt den Gregorianischen Kalender verwendet. Man kann sehen, warum, wenn wir über die Grenze des Reformdatums wechseln.

# start off with the anniversary of Shakespeare's birth in 1751
shakespeare = DateTime.iso8601('1751-04-23', Date::ENGLAND)
 #=> Tue, 23 Apr 1751 00:00:00 +0000

# add 366 days since 1752 is a leap year and April 23 is after February 29
shakespeare + 366
 #=> Thu, 23 Apr 1752 00:00:00 +0000

# add another 365 days to take us to the anniversary in 1753
shakespeare + 366 + 365
 #=> Fri, 04 May 1753 00:00:00 +0000

Wie Sie sehen können, wenn wir die Anzahl der Sonnenjahre seit Shakespeares Geburtstag genau verfolgen, wäre das korrekte Jubiläumsdatum der 4. Mai und nicht der 23. April.

Wann sollten Sie also DateTime in Ruby verwenden und wann Time? Mit ziemlicher Sicherheit werden Sie Time verwenden wollen, da Ihre Anwendung wahrscheinlich mit aktuellen Daten und Zeiten umgeht. Wenn Sie jedoch mit Daten und Zeiten in einem historischen Kontext umgehen müssen, werden Sie DateTime verwenden wollen, um die gleichen Fehler wie die UNESCO zu vermeiden. Wenn Sie sich auch mit Zeitzonen befassen müssen, dann viel Glück - bedenken Sie nur, dass Sie wahrscheinlich mit lokalen Sonnenzeiten umgehen werden, da erst im 19. Jahrhundert mit der Einführung der Eisenbahnen die Notwendigkeit für Standardzeit und schließlich Zeitzonen entstand.