„A dátumok és az idők olyan dolgok, amiket kisgyerekeknek tanítunk. Mi olyan nehéz lehet benne?”
Sok programozó elkövette már ezt a hibát, és az ezt követő tapasztalat rendszerint rossz hatással van az egészségükre és a boldogságukra.
Aki nem triviális programozást végez dátumokkal és időkkel, annak legalább fel kell készülnie arra, hogy megértse és mérsékelje a lehetséges problémákat.
Ez a dokumentum megpróbál áttekintést adni arról, hogyan kezeli a Julia a dátumokat és az időket, de a részletekhez a kézikönyvet is érdemes megnézni. Van egy Wikikönyv is, amelynek a magyarázatait néhány olvasó világosabbnak találhatja, és tartalmaz egy hasznos diagramot a típus-hierarchiáról.
Dates modulA legalapvetőbb funkciók a Dates modulban találhatók, amely része az alapértelmezett telepítésnek, de nem része a standard könyvtárnak.
A modul használatára két lehetőség van:
import Dates, majd minden függvényhívás elé tedd oda a Dates. előtagot.using Dates, ami az egész modult behozza az aktuális névtérbe (néhány problémás név kivételével).# option 1
julia> import Dates
julia> Dates.now()
2025-06-21T16:02:39.080
julia> now() # wrong: need to include `Dates.` after an import
ERROR: UndefVarError: `now` not defined in `Main`
# option 2
julia> using Dates
julia> now() # functions are now in the namespace
2025-06-21T16:03:04.161
A Dates modul nagy és bonyolult, de négy fő funkciótípust nyújt:
Dates.Date, amely nap-hónap-évet tartalmaz, de a napszakot nem.Dates.Time, amely a napszakot tartalmazza, de a dátumot nem.Dates.DateTime, amely a dátumot és az időt kombinálja.Dates.Period, amely az idő- és dátumintervallumokat kezeli.Vedd figyelembe, hogy a DateTime általában nem tartalmaz időzóna-információt (a Python ezt „naiv” datetime-nak nevezné).
Egy kivétel a now(), amely a rendszerórádról kéri le a helyi időt, és szükség esetén UTC-vé alakíthatja.
Talán a leggyakoribb igények:
Dates típus létrehozásához.Dates típusból.Date, Time vagy DateTime értékre.today() segítségével) és/vagy idő (a now() segítségével) lekérése.A vizuális zavaró tényezők csökkentése érdekében a dokumentum hátralévő részében a legtöbb példakód azt feltételezi, hogy using Dates szerepel, és kerüli a Dates. modulnév kiírását a függvényhívásokban.
Sokféleképpen írhatjuk le a dátumokat és az időket, és ezek gyakran kultúrafüggőek. A „7/6/23”-hoz hasonló, csupa számból álló dátumok kétértelműek, zavaróak, és sok drága hibát okoztak már multinacionális szervezeteknél (a szerző keserű személyes tapasztalatból mondja ezt).
A nemzetközi szabványt az ISO 8601 határozza meg, amelynek két fő előnye van:
Egy korábbi példában láttuk, hogy a Date.now() a 2025-06-21T16:03:04.161 értéket adta vissza.
Ez több részből áll össze:
YYYY-MM-DD a dátumrészhez.hh:mm:ss az időrészhez.A többi szöveges formátumról egy későbbi szakaszban lesz szó.
A Dates.Date egy viszonylag egyszerű, csak dátumot ábrázoló típus, amely nem ismeri az időket és az időzónákat.
# constructor with year, month, day arguments
julia> date1 = Date(2025, 06, 23)
2025-06-23
# constructor with ISO 8601 string
julia> date2 = Date("2025-06-23")
2025-06-23
julia> date1 == date2
true
julia> typeof(date1)
Date
A dátum egyes részeihez elérési függvények tartoznak, és ezek kis- és nagybetűvel megkülönböztetett párokban fordulnak elő.
# lowercase returns an integer
julia> month(date1)
6
julia> typeof(month(date1))
Int64
# Propercase returns a Period type
julia> Month(date1)
6 months
julia> typeof(Month(date1))
Month
Számos függvény van, amely valamennyire érti a naptárat. A következő példa csak néhányat mutat be.
julia> date1
2025-06-23
julia> dayofweek(date1) # 1 = Monday, 7 = Sunday
1
julia> dayname(date1)
"Monday"
julia> daysinmonth(date1)
30
julia> isleapyear(date1)
false
julia> lastdayofmonth(date1)
2025-06-30
A Dates.Time az alapvető, csak időt ábrázoló típus.
Nem ismeri a dátumokat: éjfélkor az idők automatikusan Time(0, 0, 0) értékre váltanak.
A teljes konstruktorformátum Time(hour, min, sec, millisec, microsec), vagy ennek ISO 8601 szerinti megfelelője.
Minden paraméter opcionális, és alapértéke 0.
julia> Time(14, 57, 25, 142)
14:57:25.142
julia> Time("14:57:25.142")
14:57:25.142
julia> Time(14, 57, 25, 142, 32)
14:57:25.142032
A Date-hez hasonlóan az egyes részek elérési függvényekkel érhetők el:
julia> minute(t) # => integer
57
julia> Minute(t) # => Period
57 minutes
A Dates.DateTime a Date és a Time típus legtöbb tulajdonságát egyesíti.
julia> dt1 = DateTime(2025, 6, 23, 14, 57, 25, 142)
2025-06-23T14:57:25.142
# date1 and t were defined in previous examples
julia> dt2 = DateTime(date1, t)
2025-06-23T14:57:25.142
Az év, a hónap és a nap paraméter alapértéke 1, az időparamétereké pedig 0.
Nehéz lehet ezeket a paramétereket fejben tartani, ezért bemenethez talán az ISO formátum a jobb választás.
Vagy egy DateTime összeállítható egy Date és egy Time értékből is, ahogy a fenti példában.
A dátum/idő komponensek mindegyikének megvan a maga Period típusa, a Year-től a Nanosecond-ig, amely egy időintervallumot képvisel.
Ezek különösen hasznosak az aritmetikához.
julia> dt1
2025-06-23T14:57:25.142
julia> Year(21)
21 years
julia> Second(61)
61 seconds
julia> dt1 + Year(21) - Second(61)
2046-06-23T14:56:24.142
julia> Date(2025, 07, 03) - Date(2025, 04, 25)
69 days
Amikor Period típusokkal dolgozol, a Julia igyekszik okosan kezelni a naptári rendellenességeket, például a hónapok hosszát, és szükség szerint kerekít.
# February has fewer days than January
julia> Date(2025, 1, 31) + Month(1)
2025-02-28
Korábban említettük az ISO 8601 szabványt, amely a Julia alapértelmezett dátum/idő ábrázolása szövegek formázásakor vagy feldolgozásakor.
Természetesen sok más formátumot is gyakran használnak, gyakran kultúrafüggő módon.
Ezek kezelésére a Juliának van egy DateFormat típusa, amely tetszőleges bonyolultságú formázó stringből állítható elő.
# dateformat"" string syntax
julia> dtfmt = dateformat"d/m/y"
dateformat"d/m/y"
julia> typeof(dtfmt)
DateFormat{Symbol("d/m/y"), Tuple{Dates.DatePart{'d'}, Dates.Delim{Char, 1}, Dates.DatePart{'m'}, Dates.Delim{Char, 1}, Dates.DatePart{'y'}}}
# DateFormat constructor
julia> DateFormat("d/m/y")
dateformat"d/m/y"
A fenti példa nagyon egyszerű, csak egy dátum az Európában gyakori nap/hónap/év formátumban. A szintaxisnak két változata látható, de az eredmény ugyanaz.
Ezután egy DateFormat bármely megfelelő string feldolgozásához használható:
julia> DateTime("14/7/2023", dtfmt)
2023-07-14T00:00:00
Egy DateFormat létrehozása jelentős többletköltséggel jár, ezért érdemes ezt a lépést csak egyszer végrehajtani (mint itt a dtfmt esetében), mert ez javítja a teljesítményt, amikor sok dátum/idő stringen iterálsz.
A formátumok ennél sokkal bonyolultabbak is lehetnek, ezért a részletekért lásd a kézikönyvet.
Ugyanez a DateFormat arra is használható, hogy egy dátumot/időt bármilyen kívánt stringformátumban adjunk ki, a Dates.format() függvény segítségével.
Sajnos úgy tűnik, hogy névtér-ütközés van a format szóval (legalábbis a Julia 1.11.5 verziójában), ezért a legjobb, ha a using Dates után is kiírod a Dates. előtagot.
julia> dt1
2025-06-23T14:57:25.142
julia> Dates.format(dt1, dateformat"e, u d")
"Mon, Jun 23"
A dokumentáció szerint a "e, u d" a hét napjának és a hónapnak a rövidített szöveges ábrázolását adja.
A szöveges ábrázolás alapértelmezésben angol. Más nyelvek is hozzáadhatók, bár ezek támogatása jelenleg nem ideális.
Ebben a feladatban egy New York-i szépségszalon időpontütemezőjén fogsz dolgozni, amely 2012. szeptember 15-én nyílt meg.
Öt részfeladatod van, amelyek mindegyike az időpontok dátumaival foglalkozik. Az időpontok 24 órás időformátumban vannak (nincs AM/PM).
Valósítsd meg a schedule_appointment() függvényt, amely egy időpont szöveges reprezentációját a megfelelő DateTime formátumba alakítja.
Vedd figyelembe, hogy a bemenet amerikai stílusú hónap/nap/év sorrendben van.
julia> schedule_appointment("07/25/2023 13:45:00")
2023-07-25T13:45:00
Valósítsd meg a has_passed() függvényt, amely egy időpontot kap, és ellenőrzi, hogy az időpont a múltban van-e:
julia> has_passed(DateTime(1999, 12, 31, 9, 0, 0))
true
Valósítsd meg az is_afternoon_appointment() függvényt, amely egy időpontot kap, és ellenőrzi, hogy az időpont délutánra esik-e (>= 12:00 és < 18:00):
julia> is_afternoon_appointment(DateTime(2023, 3, 29, 15, 0, 0))
true
Valósítsd meg a description() függvényt, amely egy időpontot kap, és visszaadja az adott dátum és idő leírását:
julia> describe(DateTime(2023, 3, 29, 15, 0, 0))
"You have an appointment on Wednesday, March 29, 2023 at 15:00"
Valósítsd meg az anniversary_date() függvényt, amely visszaadja az idei évforduló dátumát, ami szeptember 15.
julia> anniversary_date() # run during 2025
2025-09-15
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.