Zeit & Dauer
Zeit & Dauer
Abschnitt betitelt „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.
local time = require("time")Aktuelle Zeit
Abschnitt betitelt „Aktuelle Zeit“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 messenlocal start = time.now()do_work()local elapsed = time.now():sub(start)print("Took " .. elapsed:milliseconds() .. "ms")Gibt zurück: Time
Zeitwerte erstellen
Abschnitt betitelt „Zeitwerte erstellen“Aus Komponenten
Abschnitt betitelt „Aus Komponenten“-- Bestimmtes Datum/Zeit in UTC erstellenlocal 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 erstellenlocal 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 angegebenlocal 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
Abschnitt betitelt „Aus Unix-Zeitstempel“-- Aus Sekunden seit Epochlocal t = time.unix(1703862245, 0)print(t:utc():format_rfc3339()) -- "2023-12-29T15:04:05Z"
-- Mit Nanosekundenlocal t = time.unix(1703862245, 500000000) -- +500ms
-- JavaScript-Zeitstempel konvertieren (Millisekunden)local js_timestamp = 1703862245000local 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
Abschnitt betitelt „Aus String“Zeitstrings mit Gos Referenzzeitformat parsen: Mon Jan 2 15:04:05 MST 2006.
-- RFC3339 parsenlocal t, err = time.parse(time.RFC3339, "2024-12-29T15:04:05Z")if err then return nil, errend
-- Benutzerdefiniertes Format parsenlocal 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 parsenlocal 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
Abschnitt betitelt „Zeit-Methoden“Arithmetik
Abschnitt betitelt „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 erhaltenlocal diff = tomorrow:sub(t) -- gibt Duration zurückprint(diff:hours()) -- 24
-- Kalendereinheiten addieren (behandelt Monatsgrenzen korrekt)local next_month = t:add_date(0, 1, 0) -- 1 Monat addierenlocal next_year = t:add_date(1, 0, 0) -- 1 Jahr addierenlocal 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
Abschnitt betitelt „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) -- truet2:after(t1) -- truet1: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
Abschnitt betitelt „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
Abschnitt betitelt „Unix-Zeitstempel“local t = time.now()
t:unix() -- Sekunden seit Epocht:unix_nano() -- Nanosekunden seit EpochKomponenten
Abschnitt betitelt „Komponenten“local t = time.now()
-- Datumsteile holenlocal year, month, day = t:date()
-- Zeitteile holenlocal hour, min, sec = t:clock()
-- Einzelne Zugriffsmethodent:year() -- z.B. 2024t:month() -- 1-12t:day() -- 1-31t:hour() -- 0-23t:minute() -- 0-59t:second() -- 0-59t:nanosecond() -- 0-999999999t:weekday() -- 0=Sonntag .. 6=Samstagt:year_day() -- 1-366t:is_zero() -- true wenn NullwertZeitzonen-Konvertierung
Abschnitt betitelt „Zeitzonen-Konvertierung“local t = time.now()
t:utc() -- zu UTC konvertierent:in_local() -- zur lokalen Zeitzone konvertierent:in_location(ny) -- zu bestimmter Zeitzone konvertierent:location() -- aktuelle Location holent: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 |
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 rundent: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 |
Dauern erstellen
Abschnitt betitelt „Dauern erstellen“-- Aus String parsenlocal 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
Abschnitt betitelt „Dauer-Methoden“local d, _ = time.parse_duration("1h30m45s500ms")
d:hours() -- 1.5125...d:minutes() -- 90.75...d:seconds() -- 5445.5d:milliseconds() -- 5445500d:microseconds() -- 5445500000d:nanoseconds() -- 5445500000000Zeitzonen
Abschnitt betitelt „Zeitzonen“Nach Name laden
Abschnitt betitelt „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, errend
local tokyo, _ = time.load_location("Asia/Tokyo")local london, _ = time.load_location("Europe/London")
-- Zwischen Zeitzonen konvertierenlocal 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
Abschnitt betitelt „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
Abschnitt betitelt „Eingebaute Locations“time.utc -- UTC-Zeitzonetime.localtz -- Lokale System-ZeitzoneScheduling
Abschnitt betitelt „Scheduling“Ausführung für angegebene Dauer pausieren. In Workflows korrekt aufgezeichnet und wiedergegeben.
time.sleep("5s")time.sleep(500 * time.MILLISECOND)
-- Backoff-Musterfor 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 |
Gibt einen Channel zurück, der einmal nach der Dauer empfängt. Funktioniert mit channel.select.
-- Einfaches Timeoutlocal timeout = time.after("5s")timeout:receive() -- blockiert für 5 Sekunden
-- Timeout mit selectlocal 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({message = "Request timed out", kind = errors.TIMEOUT})end| Parameter | Typ | Beschreibung |
|---|---|---|
duration | number/string/Duration | Wartezeit |
Gibt zurück: Channel
Einmaliger Timer, der nach der Dauer auslöst. Kann gestoppt oder zurückgesetzt werden.
local timer = time.timer("5s")
-- Auf Timer wartentimer:response():receive()send_reminder()
-- Bei Aktivität zurücksetzenlocal 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 stoppentimer: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 |
Wiederholender Timer, der in regelmäßigen Intervallen auslöst.
-- Periodische Aufgabelocal ticker = time.ticker("30s")local ch = ticker:response()
while true do local tick_time = ch:receive() check_health()end
-- Rate-Limitinglocal ticker = time.ticker("100ms")for _, item in ipairs(items) do ticker:response():receive() process(item)endticker: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
Abschnitt betitelt „Konstanten“Dauer-Einheiten
Abschnitt betitelt „Dauer-Einheiten“Dauer-Konstanten sind in Nanosekunden. Mit Arithmetik verwenden.
time.NANOSECOND -- 1time.MICROSECOND -- 1.000time.MILLISECOND -- 1.000.000time.SECOND -- 1.000.000.000time.MINUTE -- 60 * SECONDtime.HOUR -- 60 * MINUTE
-- Beispielverwendungtime.sleep(5 * time.SECOND)local timeout = time.after(30 * time.SECOND)Format-Layouts
Abschnitt betitelt „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"time.JANUARY -- 1time.FEBRUARY -- 2time.MARCH -- 3time.APRIL -- 4time.MAY -- 5time.JUNE -- 6time.JULY -- 7time.AUGUST -- 8time.SEPTEMBER -- 9time.OCTOBER -- 10time.NOVEMBER -- 11time.DECEMBER -- 12Wochentage
Abschnitt betitelt „Wochentage“time.SUNDAY -- 0time.MONDAY -- 1time.TUESDAY -- 2time.WEDNESDAY -- 3time.THURSDAY -- 4time.FRIDAY -- 5time.SATURDAY -- 6| Bedingung | Art | Wiederholbar |
|---|---|---|
| Ungültiges Dauerformat | errors.INVALID | nein |
| Parsen fehlgeschlagen | errors.INTERNAL | nein |
| Leerer Location-Name | errors.INVALID | nein |
| Location nicht gefunden | errors.INTERNAL | 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, errend
local loc, err = time.load_location("Unknown/Zone")if err then if errors.is(err, errors.INTERNAL) then print("Location not found:", err:message()) end return nil, errendSiehe Fehlerbehandlung für die Arbeit mit Fehlern.