Zeit & Dauer
Arbeiten Sie mit Zeitwerten, Dauern, Zeitzonen und Scheduling. Erstellen Sie Timer, pausieren Sie für bestimmte Zeiträume, parsen und formatieren Sie Zeitstempel.
In Workflows gibt time.now() eine aufgezeichnete Zeitreferenz für deterministisches Replay zurück.
Laden
local time = require("time")
Aktuelle Zeit
now
Gibt die aktuelle Zeit zurück. In Workflows wird die aufgezeichnete Zeit aus der Zeitreferenz des Workflows für deterministisches Replay zurückgegeben.
local t = time.now()
print(t:format_rfc3339()) -- "2024-12-29T15:04:05Z"
-- Verstrichene Zeit messen
local start = time.now()
do_work()
local elapsed = time.now():sub(start)
print("Took " .. elapsed:milliseconds() .. "ms")
Gibt zurück: Time
Zeitwerte erstellen
Aus Komponenten
-- Bestimmtes Datum/Zeit in UTC erstellen
local t = time.date(2024, time.DECEMBER, 25, 10, 30, 0, 0, time.utc)
print(t:format_rfc3339()) -- "2024-12-25T10:30:00Z"
-- In bestimmter Zeitzone erstellen
local ny, _ = time.load_location("America/New_York")
local meeting = time.date(2024, time.JANUARY, 15, 14, 0, 0, 0, ny)
-- Standardmäßig lokale Zeitzone wenn nicht angegeben
local t = time.date(2024, 1, 15, 12, 0, 0, 0)
| Parameter | Typ | Beschreibung |
|---|---|---|
year |
number | Jahr |
month |
number | Monat (1-12 oder time.JANUARY etc.) |
day |
number | Tag des Monats |
hour |
number | Stunde (0-23) |
minute |
number | Minute (0-59) |
second |
number | Sekunde (0-59) |
nanosecond |
number | Nanosekunde (0-999999999) |
location |
Location | Zeitzone (optional, Standard ist lokal) |
Gibt zurück: Time
Aus Unix-Zeitstempel
-- Aus Sekunden seit Epoch
local t = time.unix(1703862245, 0)
print(t:utc():format_rfc3339()) -- "2023-12-29T15:04:05Z"
-- Mit Nanosekunden
local t = time.unix(1703862245, 500000000) -- +500ms
-- JavaScript-Zeitstempel konvertieren (Millisekunden)
local js_timestamp = 1703862245000
local t = time.unix(js_timestamp // 1000, (js_timestamp % 1000) * 1000000)
| Parameter | Typ | Beschreibung |
|---|---|---|
sec |
number | Unix-Sekunden |
nsec |
number | Nanosekunden-Offset |
Gibt zurück: Time
Aus String
Zeitstrings mit Gos Referenzzeitformat parsen: Mon Jan 2 15:04:05 MST 2006.
-- RFC3339 parsen
local t, err = time.parse(time.RFC3339, "2024-12-29T15:04:05Z")
if err then
return nil, err
end
-- Benutzerdefiniertes Format parsen
local t, err = time.parse("2006-01-02", "2024-12-29")
local t, err = time.parse("15:04:05", "14:30:00")
local t, err = time.parse("2006-01-02 15:04:05 MST", "2024-12-29 14:30:00 EST")
-- In bestimmter Zeitzone parsen
local ny, _ = time.load_location("America/New_York")
local t, err = time.parse("2006-01-02 15:04", "2024-12-29 14:30", ny)
| Parameter | Typ | Beschreibung |
|---|---|---|
layout |
string | Go-Zeitformat-Layout |
value |
string | Zu parsender String |
location |
Location | Standard-Zeitzone (optional) |
Gibt zurück: Time, error
Zeit-Methoden
Arithmetik
local t = time.now()
-- Dauer addieren (akzeptiert Zahl, String oder Duration)
local tomorrow = t:add("24h")
local later = t:add(5 * time.MINUTE)
local d, _ = time.parse_duration("1h30m")
local future = t:add(d)
-- Zeit subtrahieren um Dauer zu erhalten
local diff = tomorrow:sub(t) -- gibt Duration zurück
print(diff:hours()) -- 24
-- Kalendereinheiten addieren (behandelt Monatsgrenzen korrekt)
local next_month = t:add_date(0, 1, 0) -- 1 Monat addieren
local next_year = t:add_date(1, 0, 0) -- 1 Jahr addieren
local last_week = t:add_date(0, 0, -7) -- 7 Tage subtrahieren
| Methode | Parameter | Gibt zurück | Beschreibung |
|---|---|---|---|
add(duration) |
number/string/Duration | Time | Dauer addieren |
sub(time) |
Time | Duration | Differenz zwischen Zeiten |
add_date(years, months, days) |
numbers | Time | Kalendereinheiten addieren |
Vergleich
local t1 = time.date(2024, 1, 1, 0, 0, 0, 0, time.utc)
local t2 = time.date(2024, 1, 2, 0, 0, 0, 0, time.utc)
t1:before(t2) -- true
t2:after(t1) -- true
t1:equal(t1) -- true
| Methode | Parameter | Gibt zurück | Beschreibung |
|---|---|---|---|
before(time) |
Time | boolean | Ist diese Zeit vor der anderen? |
after(time) |
Time | boolean | Ist diese Zeit nach der anderen? |
equal(time) |
Time | boolean | Sind die Zeiten gleich? |
Formatierung
local t = time.now()
t:format_rfc3339() -- "2024-12-29T15:04:05Z"
t:format(time.DATE_ONLY) -- "2024-12-29"
t:format(time.TIME_ONLY) -- "15:04:05"
t:format("Mon Jan 2, 2006") -- "Sun Dec 29, 2024"
| Methode | Parameter | Gibt zurück | Beschreibung |
|---|---|---|---|
format(layout) |
string | string | Mit Go-Layout formatieren |
format_rfc3339() |
- | string | Als RFC3339 formatieren |
Unix-Zeitstempel
local t = time.now()
t:unix() -- Sekunden seit Epoch
t:unix_nano() -- Nanosekunden seit Epoch
Komponenten
local t = time.now()
-- Datumsteile holen
local year, month, day = t:date()
-- Zeitteile holen
local hour, min, sec = t:clock()
-- Einzelne Zugriffsmethoden
t:year() -- z.B. 2024
t:month() -- 1-12
t:day() -- 1-31
t:hour() -- 0-23
t:minute() -- 0-59
t:second() -- 0-59
t:nanosecond() -- 0-999999999
t:weekday() -- 0=Sonntag .. 6=Samstag
t:year_day() -- 1-366
t:is_zero() -- true wenn Nullwert
Zeitzonen-Konvertierung
local t = time.now()
t:utc() -- zu UTC konvertieren
t:in_local() -- zur lokalen Zeitzone konvertieren
t:in_location(ny) -- zu bestimmter Zeitzone konvertieren
t:location() -- aktuelle Location holen
t:location():string() -- Zeitzonennamen holen
| Methode | Parameter | Gibt zurück | Beschreibung |
|---|---|---|---|
utc() |
- | Time | Zu UTC konvertieren |
in_local() |
- | Time | Zur lokalen Zeitzone konvertieren |
in_location(loc) |
Location | Time | Zur Zeitzone konvertieren |
location() |
- | Location | Aktuelle Zeitzone holen |
Runden
Auf Dauergrenzen runden oder abschneiden. Benötigt Duration userdata (nicht Zahl oder String).
local t = time.now()
local hour_duration, _ = time.parse_duration("1h")
local minute_duration, _ = time.parse_duration("15m")
t:round(hour_duration) -- auf nächste Stunde runden
t:truncate(minute_duration) -- auf 15-Minuten-Grenze abschneiden
| Methode | Parameter | Gibt zurück | Beschreibung |
|---|---|---|---|
round(duration) |
Duration | Time | Auf nächstes Vielfaches runden |
truncate(duration) |
Duration | Time | Auf Vielfaches abschneiden |
Dauer
Dauern erstellen
-- Aus String parsen
local d, err = time.parse_duration("1h30m45s")
local d, err = time.parse_duration("500ms")
local d, err = time.parse_duration("2h30m45s500ms")
-- Aus Zahl (Nanosekunden)
local d, err = time.parse_duration(time.SECOND)
local d, err = time.parse_duration(5 * time.MINUTE)
-- Gültige Einheiten: ns, us, ms, s, m, h
| Parameter | Typ | Beschreibung |
|---|---|---|
value |
number/string/Duration | Zu parsende Dauer |
Gibt zurück: Duration, error
Dauer-Methoden
local d, _ = time.parse_duration("1h30m45s500ms")
d:hours() -- 1.5125...
d:minutes() -- 90.75...
d:seconds() -- 5445.5
d:milliseconds() -- 5445500
d:microseconds() -- 5445500000
d:nanoseconds() -- 5445500000000
Zeitzonen
Nach Name laden
Zeitzone nach IANA-Name laden (z.B. "America/New_York", "Europe/London", "Asia/Tokyo").
local ny, err = time.load_location("America/New_York")
if err then
return nil, err
end
local tokyo, _ = time.load_location("Asia/Tokyo")
local london, _ = time.load_location("Europe/London")
-- Zwischen Zeitzonen konvertieren
local t = time.now():utc()
print("UTC:", t:format(time.TIME_ONLY))
print("New York:", t:in_location(ny):format(time.TIME_ONLY))
print("Tokyo:", t:in_location(tokyo):format(time.TIME_ONLY))
| Parameter | Typ | Beschreibung |
|---|---|---|
name |
string | IANA-Zeitzonenname |
Gibt zurück: Location, error
Fester Offset
Zeitzone mit festem UTC-Offset erstellen.
-- UTC+5:30 (India Standard Time)
local ist = time.fixed_zone("IST", 5*3600 + 30*60)
-- UTC-8 (Pacific Standard Time)
local pst = time.fixed_zone("PST", -8*3600)
local t = time.date(2024, 1, 15, 12, 0, 0, 0, ist)
| Parameter | Typ | Beschreibung |
|---|---|---|
name |
string | Zonenname |
offset |
number | UTC-Offset in Sekunden |
Gibt zurück: Location
Eingebaute Locations
time.utc -- UTC-Zeitzone
time.localtz -- Lokale System-Zeitzone
Scheduling
sleep
Ausführung für angegebene Dauer pausieren. In Workflows korrekt aufgezeichnet und wiedergegeben.
time.sleep("5s")
time.sleep(500 * time.MILLISECOND)
-- Backoff-Muster
for attempt = 1, 3 do
local ok = try_operation()
if ok then break end
time.sleep(tostring(attempt) .. "s")
end
| Parameter | Typ | Beschreibung |
|---|---|---|
duration |
number/string/Duration | Schlafzeit |
after
Gibt einen Channel zurück, der einmal nach der Dauer empfängt. Funktioniert mit channel.select.
-- Einfaches Timeout
local timeout = time.after("5s")
timeout:receive() -- blockiert für 5 Sekunden
-- Timeout mit select
local response_ch = make_request()
local timeout_ch = time.after("30s")
local result = channel.select{
response_ch:case_receive(),
timeout_ch:case_receive()
}
if result.channel == timeout_ch then
return nil, errors.new("TIMEOUT", "Request timed out")
end
| Parameter | Typ | Beschreibung |
|---|---|---|
duration |
number/string/Duration | Wartezeit |
Gibt zurück: Channel
timer
Einmaliger Timer, der nach der Dauer auslöst. Kann gestoppt oder zurückgesetzt werden.
local timer = time.timer("5s")
-- Auf Timer warten
timer:response():receive()
send_reminder()
-- Bei Aktivität zurücksetzen
local idle_timer = time.timer("5m")
while true do
local r = channel.select{
user_activity:case_receive(),
idle_timer:response():case_receive()
}
if r.channel == idle_timer:response() then
logout_user()
break
end
idle_timer:reset("5m")
end
-- Timer stoppen
timer:stop()
| Parameter | Typ | Beschreibung |
|---|---|---|
duration |
number/string/Duration | Zeit bis zum Auslosen |
Gibt zurück: Timer, error
| Timer-Methode | Parameter | Gibt zurück | Beschreibung |
|---|---|---|---|
response() |
- | Channel | Timer-Channel holen |
channel() |
- | Channel | Alias für response() |
stop() |
- | boolean | Timer abbrechen |
reset(duration) |
number/string/Duration | boolean | Mit neuer Dauer zurücksetzen |
ticker
Wiederholender Timer, der in regelmäßigen Intervallen auslöst.
-- Periodische Aufgabe
local ticker = time.ticker("30s")
local ch = ticker:response()
while true do
local tick_time = ch:receive()
check_health()
end
-- Rate-Limiting
local ticker = time.ticker("100ms")
for _, item in ipairs(items) do
ticker:response():receive()
process(item)
end
ticker:stop()
| Parameter | Typ | Beschreibung |
|---|---|---|
duration |
number/string/Duration | Intervall zwischen Ticks |
Gibt zurück: Ticker, error
| Ticker-Methode | Parameter | Gibt zurück | Beschreibung |
|---|---|---|---|
response() |
- | Channel | Ticker-Channel holen |
channel() |
- | Channel | Alias für response() |
stop() |
- | boolean | Ticker stoppen |
Konstanten
Dauer-Einheiten
Dauer-Konstanten sind in Nanosekunden. Mit Arithmetik verwenden.
time.NANOSECOND -- 1
time.MICROSECOND -- 1.000
time.MILLISECOND -- 1.000.000
time.SECOND -- 1.000.000.000
time.MINUTE -- 60 * SECOND
time.HOUR -- 60 * MINUTE
-- Beispielverwendung
time.sleep(5 * time.SECOND)
local timeout = time.after(30 * time.SECOND)
Format-Layouts
time.RFC3339 -- "2006-01-02T15:04:05Z07:00"
time.RFC3339NANO -- "2006-01-02T15:04:05.999999999Z07:00"
time.RFC822 -- "02 Jan 06 15:04 MST"
time.RFC822Z -- "02 Jan 06 15:04 -0700"
time.RFC850 -- "Monday, 02-Jan-06 15:04:05 MST"
time.RFC1123 -- "Mon, 02 Jan 2006 15:04:05 MST"
time.RFC1123Z -- "Mon, 02 Jan 2006 15:04:05 -0700"
time.DATE_TIME -- "2006-01-02 15:04:05"
time.DATE_ONLY -- "2006-01-02"
time.TIME_ONLY -- "15:04:05"
time.KITCHEN -- "3:04PM"
time.STAMP -- "Jan _2 15:04:05"
time.STAMP_MILLI -- "Jan _2 15:04:05.000"
time.STAMP_MICRO -- "Jan _2 15:04:05.000000"
time.STAMP_NANO -- "Jan _2 15:04:05.000000000"
Monate
time.JANUARY -- 1
time.FEBRUARY -- 2
time.MARCH -- 3
time.APRIL -- 4
time.MAY -- 5
time.JUNE -- 6
time.JULY -- 7
time.AUGUST -- 8
time.SEPTEMBER -- 9
time.OCTOBER -- 10
time.NOVEMBER -- 11
time.DECEMBER -- 12
Wochentage
time.SUNDAY -- 0
time.MONDAY -- 1
time.TUESDAY -- 2
time.WEDNESDAY -- 3
time.THURSDAY -- 4
time.FRIDAY -- 5
time.SATURDAY -- 6
Fehler
| Bedingung | Art | Wiederholbar |
|---|---|---|
| Ungültiges Dauerformat | errors.INVALID |
nein |
| Parsen fehlgeschlagen | errors.INVALID |
nein |
| Leerer Location-Name | errors.INVALID |
nein |
| Location nicht gefunden | errors.NOT_FOUND |
nein |
| Dauer <= 0 (timer/ticker) | errors.INVALID |
nein |
local t, err = time.parse(time.RFC3339, "invalid")
if err then
if errors.is(err, errors.INVALID) then
print("Invalid format:", err:message())
end
return nil, err
end
local loc, err = time.load_location("Unknown/Zone")
if err then
if errors.is(err, errors.NOT_FOUND) then
print("Location not found:", err:message())
end
return nil, err
end
Siehe Fehlerbehandlung für die Arbeit mit Fehlern.