Kurzusok
/
Julia
Julia
/
Feladatok
/
Időpontfoglalás szépségszalonba
Időpontfoglalás szépségszalonba

Időpontfoglalás szépségszalonba

Tanulófeladat

Bevezetés

„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.

A Dates modul

A 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:

  1. Írd be, hogy import Dates, majd minden függvényhívás elé tedd oda a Dates. előtagot.
  2. Írd be, hogy 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:

  • Egy megfelelő bemeneti formátum feldolgozása egy Dates típus létrehozásához.
  • A kívánt numerikus vagy szöveges formátum kinyerése egy Dates típusból.
  • Eltolás alkalmazása egy Date, Time vagy DateTime értékre.
  • Két ilyen érték közötti intervallum kiszámítása.
  • Az aktuális dátum (a today() segítségével) és/vagy idő (a now() segítségével) lekérése.
Note

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.

Dátum- és időformátumok

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:

  • A feldolgozás gyors és egyértelmű.
  • A rendezés egyszerű, mivel a datetime kezelhető hagyományos szövegként, és ábécésorrendbe rendezhető.

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.
  • Opcionálisan ezredmásodpercek (vagy még kisebb egység) a tizedespont után.

A többi szöveges formátumról egy későbbi szakaszban lesz szó.

Dátumok

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

Lekérdező függvények

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

Idők

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

DateTime-ok

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.

Periódusok

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

Szöveges ábrázolások

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.

Utasítások

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).

1. A csupa számból álló időpont dátumának értelmezése

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

2. Annak ellenőrzése, hogy egy időpont már elmúlt-e

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

3. Annak ellenőrzése, hogy az időpont délutánra esik-e

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

4. Az időpont dátumának és idejének leírása

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"

5. Az évforduló dátumának visszaadása

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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Julia Exercism

Készen állsz elkezdeni a(z) Időpontfoglalás szépségszalonba feladatot?

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.