class Time

Ein Time-Objekt repräsentiert ein Datum und eine Uhrzeit

Time.new(2000, 1, 1, 0, 0, 0) # => 2000-01-01 00:00:00 -0600

Obwohl sein Wert als einzelne Zahl ausgedrückt werden kann (siehe Epoch-Sekunden unten), kann es praktisch sein, mit dem Wert in Teilen zu arbeiten

t = Time.new(-2000, 1, 1, 0, 0, 0.0)
# => -2000-01-01 00:00:00 -0600
t.year # => -2000
t.month # => 1
t.mday # => 1
t.hour # => 0
t.min # => 0
t.sec # => 0
t.subsec # => 0

t = Time.new(2000, 12, 31, 23, 59, 59.5)
# => 2000-12-31 23:59:59.5 -0600
t.year # => 2000
t.month # => 12
t.mday # => 31
t.hour # => 23
t.min # => 59
t.sec # => 59
t.subsec # => (1/2)

Epoch-Sekunden

Epoch-Sekunden ist die exakte Anzahl von Sekunden (einschließlich fraktionaler Bruchteile von Sekunden) seit dem Unix-Epoch, 1. Januar 1970.

Sie können diesen Wert exakt mit der Methode Time.to_r abrufen

Time.at(0).to_r        # => (0/1)
Time.at(0.999999).to_r # => (9007190247541737/9007199254740992)

Andere Abrufmethoden wie Time#to_i und Time#to_f können einen Wert zurückgeben, der Bruchteile von Sekunden rundet oder abschneidet.

Zeit-Auflösung

Ein Time-Objekt, das von der Systemuhr abgeleitet ist (z. B. durch die Methode Time.now), hat die vom System unterstützte Auflösung.

Interne Darstellung der Zeit

Konzeptionell verwendet die Klasse Time einen rationalen Wert, um die Anzahl der Sekunden seit dem Epoch, 1970-01-01 00:00:00 UTC, darzustellen. Es gibt keine Grenz- oder Auflösungseinschränkungen. Der Wert kann mit Time#to_r abgerufen werden.

Die Klasse Time verwendet immer den Gregorianischen Kalender. D. h. der proleptische Gregorianische Kalender wird verwendet. Andere Kalender, wie z. B. der Julianische Kalender, werden nicht unterstützt.

Die Implementierung verwendet eine vorzeichenbehaftete 63-Bit-Ganzzahl, ein Integer (Bignum)-Objekt oder ein Rational-Objekt, um einen rationalen Wert darzustellen. (Die vorzeichenbehaftete 63-Bit-Ganzzahl wird unabhängig von 32- und 64-Bit-Umgebungen verwendet.) Der Wert stellt die Anzahl der Nanosekunden seit dem Epoch dar. Die vorzeichenbehaftete 63-Bit-Ganzzahl kann den Zeitraum von 1823-11-12 bis 2116-02-20 darstellen. Wenn ein Integer- oder Rational-Objekt verwendet wird (vor 1823, nach 2116, unter Nanosekunde), arbeitet Time langsamer als wenn die vorzeichenbehaftete 63-Bit-Ganzzahl verwendet wird.

Ruby verwendet die C-Funktionen localtime und gmtime, um zwischen der Zahl und einem 6-Tupel (Jahr, Monat, Tag, Stunde, Minute, Sekunde) zu wechseln. localtime wird für die lokale Zeit und gmtime für die UTC verwendet.

Integer und Rational haben keine Bereichsbeschränkung, aber localtime und gmtime haben Bereichsbeschränkungen aufgrund der C-Typen time_t und struct tm. Wenn diese Grenze überschritten wird, extrapoliert Ruby die localtime-Funktion.

time_t kann 1901-12-14 bis 2038-01-19 darstellen, wenn es sich um eine vorzeichenbehaftete 32-Bit-Ganzzahl handelt, und -292277022657-01-27 bis 292277026596-12-05, wenn es sich um eine vorzeichenbehaftete 64-Bit-Ganzzahl handelt. Allerdings unterstützt localtime auf einigen Plattformen keine negativen time_t-Werte (vor 1970).

struct tm hat das Mitglied tm_year zur Darstellung von Jahren. (tm_year = 0 bedeutet das Jahr 1900.) Es ist im C-Standard als int definiert. tm_year kann Jahre zwischen -2147481748 und 2147485547 darstellen, wenn int 32-Bit ist.

Ruby unterstützt Schaltsekunden, solange die C-Funktionen localtime und gmtime sie unterstützen. Diese verwenden in den meisten Unix-Systemen die tz-Datenbank. Die tz-Datenbank enthält Zeitzonen, die Schaltsekunden unterstützen. Zum Beispiel unterstützt "Asia/Tokyo" keine Schaltsekunden, aber "right/Asia/Tokyo" unterstützt Schaltsekunden. Ruby unterstützt also Schaltsekunden, wenn die Umgebungsvariable TZ auf "right/Asia/Tokyo" gesetzt ist, in den meisten Unix-Systemen.

Beispiele

Alle diese Beispiele wurden unter Verwendung der Zeitzone EST durchgeführt, die GMT-5 ist.

Erstellen einer neuen Time-Instanz

Sie können eine neue Instanz von Time mit Time.new erstellen. Dies verwendet die aktuelle Systemzeit. Time.now ist ein Alias dafür. Sie können auch Teile der Zeit an Time.new übergeben, wie Jahr, Monat, Minute usw. Wenn Sie eine Zeit auf diese Weise konstruieren möchten, müssen Sie mindestens ein Jahr angeben. Wenn Sie nur das Jahr übergeben, wird die Zeit standardmäßig auf den 1. Januar des Jahres um 00:00:00 Uhr in der aktuellen Systemzeitzone gesetzt. Hier sind einige Beispiele

Time.new(2002)         #=> 2002-01-01 00:00:00 -0500
Time.new(2002, 10)     #=> 2002-10-01 00:00:00 -0500
Time.new(2002, 10, 31) #=> 2002-10-31 00:00:00 -0500

Sie können einen UTC-Offset übergeben

Time.new(2002, 10, 31, 2, 2, 2, "+02:00") #=> 2002-10-31 02:02:02 +0200

Oder ein Zeitzonenobjekt

zone = timezone("Europe/Athens")      # Eastern European Time, UTC+2
Time.new(2002, 10, 31, 2, 2, 2, zone) #=> 2002-10-31 02:02:02 +0200

Sie können auch Time.local und Time.utc verwenden, um lokale und UTC-Zeitzonen abzuleiten, anstatt die aktuelle Systemeinstellung zu verwenden.

Sie können auch eine neue Zeit mit Time.at erstellen, die die Anzahl der Sekunden (mit Bruchteilen) seit dem Unix-Epoch entgegennimmt.

Time.at(628232400) #=> 1989-11-28 00:00:00 -0500

Arbeiten mit einer Instanz von Time

Sobald Sie eine Instanz von Time haben, gibt es eine Vielzahl von Dingen, die Sie damit tun können. Nachfolgend finden Sie einige Beispiele. Für alle folgenden Beispiele gehen wir davon aus, dass Sie Folgendes getan haben

t = Time.new(1993, 02, 24, 12, 0, 0, "+09:00")

War das ein Montag?

t.monday? #=> false

Welches Jahr war das noch mal?

t.year #=> 1993

War zu dieser Zeit Sommerzeit?

t.dst? #=> false

Wie heißt der Tag ein Jahr später?

t + (60*60*24*365) #=> 1994-02-24 12:00:00 +0900

Wie viele Sekunden waren das seit dem Unix-Epoch?

t.to_i #=> 730522800

Sie können auch Standardfunktionen ausführen, wie das Vergleichen zweier Zeiten.

t1 = Time.new(2010)
t2 = Time.new(2011)

t1 == t2 #=> false
t1 == t1 #=> true
t1 <  t2 #=> true
t1 >  t2 #=> false

Time.new(2010,10,31).between?(t1, t2) #=> true

Was gibt es hier

Zuerst, was gibt es noch. Klasse Time

Hier bietet die Klasse Time Methoden, die nützlich sind für

Methoden zum Erstellen

Methoden zum Abrufen

Methoden zum Abfragen

Methoden zum Vergleichen

Methoden zur Konvertierung

Methoden zum Runden

Für die Argumentformen von zone siehe Zeitzonenspezifizierer.

Zeitzonenspezifizierer

Bestimmte Time-Methoden akzeptieren Argumente, die Zeitzonen angeben

Der Wert, der mit einer dieser Optionen angegeben wird, muss einer der folgenden sein (jeweils unten detailliert)

Stunden-/Minuten-Offsets

Der Wert für zone kann ein Zeichenketten-Offset von UTC im Format '+HH:MM' oder '-HH:MM' sein, wobei

Beispiele

t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
Time.at(t, in: '-23:59')            # => 1999-12-31 20:16:01 -2359
Time.at(t, in: '+23:59')            # => 2000-01-02 20:14:01 +2359

Einbuchstabige Offsets

Der Wert für zone kann ein Buchstabe im Bereich 'A'..'I' oder 'K'..'Z' sein; siehe Liste der militärischen Zeitzonen

t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
Time.at(t, in: 'A')                 # => 2000-01-01 21:15:01 +0100
Time.at(t, in: 'I')                 # => 2000-01-02 05:15:01 +0900
Time.at(t, in: 'K')                 # => 2000-01-02 06:15:01 +1000
Time.at(t, in: 'Y')                 # => 2000-01-01 08:15:01 -1200
Time.at(t, in: 'Z')                 # => 2000-01-01 20:15:01 UTC

Ganzzahlige Offsets

Der Wert für zone kann eine ganzzahlige Anzahl von Sekunden im Bereich -86399..86399 sein

t = Time.utc(2000, 1, 1, 20, 15, 1) # => 2000-01-01 20:15:01 UTC
Time.at(t, in: -86399)              # => 1999-12-31 20:15:02 -235959
Time.at(t, in: 86399)               # => 2000-01-02 20:15:00 +235959

Zeitzonenobjekte

Der Wert für zone kann ein Objekt sein, das auf bestimmte Zeitzonenmethoden reagiert, z. B. eine Instanz von Timezone und TZInfo.

Die Zeitzonenmethoden sind

Eine benutzerdefinierte Zeitzonenklasse kann diese Instanzmethoden haben, die aufgerufen werden, wenn sie definiert sind

Time-ähnliche Objekte

Ein Time-ähnliches Objekt ist ein Containerobjekt, das mit Zeitzonenbibliotheken für die Zeitzonenkonvertierung Schnittstellen kann.

Die Argumente für die oben genannten Zeitzonenkonvertierungsmethoden haben Attribute, die denen von Time ähneln, außer dass zeitzonenbezogene Attribute bedeutungslos sind.

Die von den Methoden local_to_utc und utc_to_local eines Zeitzonenobjekts zurückgegebenen Objekte können von der gleichen Klasse wie ihre Argumente sein, von beliebigen Objektklassen oder von der Klasse Integer.

Für eine zurückgegebene Klasse, die keine Integer ist, muss die Klasse die folgenden Methoden haben

Für eine zurückgegebene Integer werden ihre Komponenten, zerlegt in UTC, als Zeiten in der angegebenen Zeitzone interpretiert.

Zeitzonennamen

Wenn die Klasse (der Empfänger von Klassenmethoden oder die Klasse des Empfängers von Instanzmethoden) eine Singleton-Methode find_timezone hat, wird diese Methode aufgerufen, um das entsprechende Zeitzonenobjekt aus einem Zeitzonennamen zu erhalten.

Zum Beispiel mit Timezone

class TimeWithTimezone < Time
  require 'timezone'
  def self.find_timezone(z) = Timezone[z]
end

TimeWithTimezone.now(in: "America/New_York")        #=> 2023-12-25 00:00:00 -0500
TimeWithTimezone.new("2023-12-25 America/New_York") #=> 2023-12-25 00:00:00 -0500

Oder mit TZInfo

class TimeWithTZInfo < Time
  require 'tzinfo'
  def self.find_timezone(z) = TZInfo::Timezone.get(z)
end

TimeWithTZInfo.now(in: "America/New_York")          #=> 2023-12-25 00:00:00 -0500
TimeWithTZInfo.new("2023-12-25 America/New_York")   #=> 2023-12-25 00:00:00 -0500

Sie können diese Methode pro Unterklasse definieren oder auf der obersten Ebene der Klasse Time.