HITUT – Bibliai tanulmányok

Héber-Gergely Naptár Átváltó és Konverter


Az alábbi modul a legmodernebb, kétirányú világi év – zsidó év naptár konverter ezen a weboldalon! Ez az interaktív online eszköz és dátum átváltó lehetővé teszi a nálunk használatos Gergely-naptár szerinti időpontok azonnali átszámítását a hagyományos héber naptár szerinti pontos évre, hónapra és napra, valamint a zsidó évszámok visszakeresését a világi időszámításba. Az alkalmazás a modern böngészőmotorok beépített nemzetköziesítési API-ját használja, így külső függvénykönyvtárak letöltése nélkül, matematikai és csillagászati pontossággal kezeli a szökőéveket, a luniszoláris naptáreltolódásokat és a változó hónaphosszakat.


Naptár Átváltó és Konverter program

×

Teljesen ingyenes naptár konverter kódok és letöltés

Szeretnéd saját honlapodon is felhasználni ezt a professzionális eszközt? Jó hír: a weboldalon található dátum átváltó elem teljes HTML, CSS és JavaScript forráskódja teljesen ingyenesen, licencdíjak nélkül másolható és beépíthető bármilyen egyedi weboldal vagy tartalomkezelő rendszer (pl. WordPress) forráskódjába. Nem kell nehéz külső függvénykönyvtárakat letölteni, és nem kell rejtett költségektől tartani. Használd fel az oldal legalján található építőkockákat külön-külön (html kód, css és script), vagy töltsd le az azonnal futtatható, egybefüggő és kulcsrakész "date-converter.html" fájlt az alábbi gombra kattintva (zip fájl, letöltés után ki kell csomagolni)!

"Nyers" kódok letöltése ingyen

A teljesen ingyenes naptár konverter HTML, CSS és JavaScript kódjai „nyers” formában, külön-külön is megtalálhatók a weboldal legalján. Saját weboldalba építve teljesen szabadon és díjmentesen használhatók. Az egyetlen kikötés, hogy a forráskódokat pénzért, haszonszerzés céljából továbbértékesíteni vagy forgalomba hozni szigorúan tilos.

Konverzió eredménye a gyakorlatban

Az alábbi ábrán és felhasználói felületen pontosan látható, hogyan jelenik meg a konverzió eredménye a gyakorlatban, amikor egy megadott világi dátumot a beépített algoritmus átszámít a megfelelő zsidó évre, hónapra és napra az "Átszámítás elvégzése" gombra kattintás után.

Zsidó és világi naptár dátum konvertáló naptár-box felhasználói felülete
Kép 1: A naptár-box működése egy konkrét dátum (például 2026-10-30) átszámításakor, amely hajszálpontosan mutatja a zsidó 5787-es év Hesván hónapjának 19. napját.

Ez a vizuális visszajelzés megerősíti, hogy a script logikája és a böngésző nemzetköziesítési motorja nem csupán egy becsült évet kalkulál ki, hanem a holdfázisok és a napév eltolódásait is figyelembe véve adja meg a pontos zsidó újhónapot.

Ellenőriztem a naptár által kidobott eredményt (2026-10-30 ➔ 5787. Hesván 19.), és a hivatalos zsidó naptári adatok alapján az átszámítás tökéletesen stimmel.

Miért lett ez a naptár verzió ilyen hihetetlenül pontos?

Nézd meg a naptár finomításait ezen a konkrét dátumon:

  • 1. Az újév kezelése: Mivel a vizsgált dátum (2026. október 30.) már az őszbe nyúlik, a naptár helyesen felismerte, hogy a zsidó újév (Ros Hásáná) már lezajlott (ami egyébként 2026. szeptember 12-én volt). Emiatt az évszámot precízen átugrasztotta a következő évre: 5787.
  • 2. Az okos évszak-detektálás: A megjegyzés mező automatikusan és helyesen átváltott arra, hogy „Ez az időszak ősz/tél kategóriába esik.”, mivel a Hesván egy őszi hónap.
  • 3. A bepéptett motor ereje: Ha ezt a böngészőbe épített logikát kézzel kellett volna megírni (kiszámolni az őszi holdújév pontos csúszkáló napját), az több száz sornyi, könnyen elromló kódot jelentett volna. Az Intl.DateTimeFormat API-val viszont nulla plusz súly mellett érhetjük el ezt a professzionális pontosságot. Ezzel a kóddal ez a naptár dobozod teljesen hibamentes!

Mit tehetsz következő lépésként?

Ez pont az, amit mindenki akar, egy helyesen működő naptár dátum átváltó. És, ha másik weboldalba másolod át a „main-content” részbe (vagy ahová szeretnéd) és az nagyobb vagy kisebb méretű mint, ami ezen a weboldalon látható, a használt HTML-struktúra és CSS-stíluslap kifejezetten modern, flexibilis és teljesen reszponzív kialakítása miatt a naptár doboz nem lesz kisebb vagy nagyobb, ami miatt esetleg túlcsordul jobbra vagy balra..

A kód remek munka eredménye, így ha ezt beilleszted egy másik, saját weboldal "main-content" (fő tartalom) részébe, a doboz gyönyörűen igazodni fog a rendelkezésre álló helyhez.

Itt a részletes magyarázat, hogy miért nem fog elcsúszni vagy túlcsordulni semmilyen eszközön:

Miért teljesen Reszponzív a naptár?

  • 1. Rugalmas elrendezés (Flexbox & Wrap): A .calc-grid osztály display: flex; és flex-wrap: wrap; tulajdonságokat használ. Ez azt jelenti, hogy ha egy kisebb kijelzőn (például mobiltelefonon) a beviteli mezők nem férnek el egymás mellett, nem fognak kilógni a képernyőből, hanem automatikusan és elegánsan egymás alá ugranak.
  • 2. Intelligens Media Query-k: A CSS fájl végén található @media screen szabályok kifejezetten a telefonokra és táblagépekre lettek optimalizálva:
    • 768px szélesség alatt (táblagépek, nagyobb mobilok): A rács automatikusan függőleges oszloppá alakul (flex-direction: column), a gomb pedig nagyobb lesz, hogy ujjal is könnyű legyen rányomni.
    • 480px szélesség alatt (kisebb mobilok): Az eredményjelző lila-fehér dobozai (.result-box-wrapper) szintén egymás alá rendeződnek, és a szélességük felveszi a mobil kijelző méretét, teljesen megakadályozva a jobbra-balra való kilógást.

Mi történik, ha bemásolod a kódokat a weboldaladba?

  • Nem fog túlcsordulni: A fő konténer (.calc-box) nem fix pixelszélességgel (pl. width: 500px) van korlátozva, hanem rugalmas margókkal és belső kitöltésekkel dolgozik. Az eredményjelző #calcResult doboz pedig kapott egy max-width: 520px; korlátot, ami biztosítja, hogy óriási monitorokon se nyúljon el csúnyán, hanem megőrizze a kompakt, elegáns formáját.
  • Alkalmazkodik a környezethez: Bármilyen széles is a hordozó weboldalad központi része, a naptárad pontosan ki fogja tölteni a neki szánt helyet (maximum a tervezett 520-600 pixel szélességig), miközben középre igazítva tartja az elemeit.

Egyetlen apró tanács a biztonság kedvéért:

Amikor átmásolod a CSS-t a másik oldalra, figyelj arra, hogy a céloldalon ne legyen egy másik, globális ".calc-box" vagy ".result-box" nevű osztály, ami bekavarhat a stílusokba. Mivel ezek elég egyedi nevek, elenyésző az esélye az ütközésnek, ha mégis előfordul ütközés, egyszerűen nevezd át az osztályt bármi másra és a scriptben is pl.: '.naptar-box" vagy ".eredmeny-box" stb.

Nemcsak belsőleg (a JavaScript motor terén) zseniális és pontos naptárad lesz, hanem külsőleg is egy abszolút profi, időtálló és rugalmas elem.

Hogyan készült

A feladat azért tűnik nehéznek, mert a zsidó naptár egy luniszoláris (hold-nap) naptár, míg a nálunk használatos Gergely-naptár tisztán szoláris (nap) naptár.

1. Változó évhossz (Szökőévek)

A sikeres programozáshoz a következő fix szabályokat kell beépíteni a scriptbe: Mivel a holdév kb. 11 nappal rövidebb a napévnél, a zsidó naptár egy 19 éves ciklust (Metón-ciklus) használ, hogy utolérje a Napot.

  • Egy 19 éves cikluson minden 3., 6., 8., 11., 14., 17. és 19. év szökőév.
  • Sima évben 12 hónap van, szökőévben a zsidó naptárba egy teljes plusz hónapot (Adar I.) iktatnak be.

A megfogalmazás elsőre megtévesztő lehet, a zsidó vallási törvények (Háláchá) és a naptárszabályok szerint a betoldott plusz hónap az Adar I. (Ádár Álef), és nem az Adar II. A naptár logikája a következőképpen épül fel:

Melyik az „igazi” Ádár?

Rendes (sima) évben csak egy darab Ádár hónap van, amely fixen 29 napos. Szökőévben ezt a hónapot megkettőzik, és a naptárba beékelnek egy 30 napos extra hónapot közvetlenül a rendes Ádár elé.

  • A beékelt, új hónap lesz az Adar I.
  • A mögötte következő, eredeti hónap pedig felveszi az Adar II. (Ádár Bét / Második Ádár) nevet.

2. Változó hónaphossz (A halasztások szabályai)

A zsidó naptárban az újév (Ros Hásáná) nem eshet a hét bizonyos napjaira vallási okokból (például, hogy Jom Kippur ne essen péntekre vagy vasárnapra, mert az kezelhetetlen helyzetet teremtene a Sabbat miatt).

  • Emiatt az évkezdést szükség esetén 1-2 nappal elhalasztják (Dechijot szabályok).
  • Hogy ezt kompenzálják, két egymást követő hónap (Hesván és Kiszlév) hossza évről évre változhat (lehet 29 vagy 30 napos).

3. A megoldás kulcsa a scriptben

Ha naptárkonvertáló scriptet akarunk írni, nem érdemes napokat léptetni ciklusokkal, mert könnyű hibázni. A modern programozásban a bevált módszer a következő:

  • 1. Julián dátum (Julian Day Number) használata: Minden dátumot (legyen az zsidó vagy Gergely) számoljunk át egy fix kiindulópont óta eltelt napok számává.
  • 2. Kész algoritmusok: Ne próbáljuk feltalálni a spanyolviaszt, a zsidó naptár matematikai leírását Gauss óta pontosan ismerjük. Érdemes a standard „Calendrical Calculations” (Nachum Dershowitz és Edward M. Reingold) algoritmusait használni.
  • 3. Kész könyvtárak: A legtöbb nyelvben (Python, JavaScript, PHP) léteznek beépített vagy külső naptárkezelő funkciók, amelyek ezt hibátlanul elvégzik (pl. PHP jewishtogoandrian, Python convertdate csomag).

Amire figyelni kell: A zsidó naptárban a napok naplementekor kezdődnek, nem éjfélkor. Ha egy világi naptárben jelölni akarunk egy zsidó ünnepet, az valójában már az előző világi nap estéjén elkezdődik.

Mit tud egy modern böngésző

A legokosabb és legkisebb méretű (script) megoldás a pontos héber dátum kiszámítására a modern böngészőkbe beépített Intl.DateTimeFormat (nemzetköziesítési API) használata.

  • Ez a beéptett motor matematikai pontossággal végzi el a számítást (kezeli a szökőéveket és a változó hónaphosszakat is), így nem kell külső, nehéz függvénykönyvtárakat letölteni, a kód mégis precíz marad.
  • A modern böngészőkbe beépített Intl (Internationalization API) objektum használata messze a legelegánsabb, leggyorsabb és „legkönnyebb” megoldás, hiszen a bonyolult naptárszámítási logikát maga a böngészőmotor (a háttérben általában az ICU nevű robusztus könyvtár) végzi el.
  • Így a JavaScript kód mérete gyakorlatilag nulla bájt extra terhet jelent a felhasználónak, mégis atombiztos eredményt ad

Amire az Intl API használatakor figyelni kell

Ez a megoldás zseniális, azonban van két fontos apróság, amit a fejlesztés során észben kell tartani:

  • 1. A naplemente-hatás: Az Intl API a standard világi időszámítás (éjfél) szerint vált napot. A zsidó naptárban viszont a napok naplementekor kezdődnek. Ha a scriptet este futtatja valaki, az Intl még a világi naphoz tartozó héber dátumot fogja mutatni, miközben a zsidó naptár szerint már a következő nap van.
  • 2. Visszafele számítás: Az Intl.DateTimeFormat arra lett kitalálva, hogy egy Date objektumból (Gergely-naptár) szöveges formátumot gyártson. Ha a feladat fordított – vagyis a felhasználó kiválaszt egy héber dátumot, és azt kell visszaalakítani Gergely-naptárrá –, arra az Intl önmagában nem képes, olyankor mégis szükség lehet egy minimális egyéni algoritmusra vagy a készülő Temporal API-ra (a letöltendő script tartalmazza).

Mindent összevetve, ha a cél a héber dátumok pontos és erőforrás-hatékony megjelenítése, a javasolt Intl API a létező legjobb modern megközelítés.

Nagyszerű dátum konvertáló projekt

A kétirányú nagyszerű projekt naptárválasztó (Calendar Box) elkészítéséhez a legnagyobb kihívást a Zsidó év ➔ Világi év (Gergely) irány jelenti, mivel – ahogy korábban beszéltük – a beépített Intl API közvetlenül csak a Világi év ➔ Zsidó év irányt támogatja.

A probléma elegáns áthidalására a legjobb módszer egy matematikai közelítés (bisection / kereső algoritmus). Mivel az Intl API hajszálpontosan tudja, hogy egy adott Gergely-dátumhoz milyen héber dátum tartozik, a scriptünk képes „megkeresni” a helyes Gergely-dátumot anélkül, hogy nehéz külső könyvtárakat kellene letölteni.

Ez az elem választható mezőt tartalmaz, azaz ha a felhasználó Zsidó év ➔ Világi év naptár dátumra akar váltani egy akármilyen évszámot, a lefelé mutató nyílra kattintva teheti meg.

A naptár dátum konvertáló választható felülete
Kép 2: A naptár-box dinamikus működése irányváltáskor. A „Konverzió iránya” legördülő menüben a felhasználó szabadon választhat a világi teljes dátum bevitele vagy a zsidó évszám alapú visszafele számítás között.

A fenti ábrán jól látható a felhasználói felület rugalmassága: a „Konverzió iránya” menüpontra kattintva a látogató azonnal átválthat a két időszámítási mód között. Az intelligens script ilyenkor a háttérben automatikusan átrendezi a beviteli mezőket, így a „Zsidó év ➔ Világi év” opció kiválasztásakor a teljes dátumválasztó helyett egy tiszta számbeviteli mező jelenik meg, biztosítva a letisztult és intuitív felhasználói élményt minden eszközön.

Hogyan működik ez a motor a háttérben?

  • 1. Világi év ➔ Zsidó év: Amikor a naptár-bevitelt változtatjuk, az Intl.DateTimeFormat darabjaira szedi a dátumot (formatToParts), és kiolvassa a pontos héber évet, hónapot és napot.
  • 2. Zsidó év ➔ Világi év (A trükk): Amikor beírunk egy héber dátumot (pl. 5786. Elul 1.), a háttérben elindul egy villámgyors bináris keresőalgoritmus. Kiszámolja a hozzávetőleges Gergely-évet, majd azon az éven belül másodpercek törtrésze alatt „rárepül” arra az egyetlen Gergely-napra, amelyre az Intl API pont azt a héber dátumot adja vissza, amit a felhasználó beállított.

A megoldás előnyei:

  • 0 darab külső könyvtár: Nincs szükség semmilyen plusz letöltésre, nem lassítja az oldalt.
  • Tökéletes pontosság: Mivel a keresés alapja maga az Intl API, kizárt, hogy a két irány ellentmondjon egymásnak. Kezeli a 29/30 napos hónapváltozásokat és a szökőéveket is.

Az eredmény matematikailag és a script logikája szerint is pontos

  • 1. Dinamikus beviteli mező: Amikor kiválasztod a "Világi év ➔ Zsidó év" opciót, a kód automatikusan átalakítja az input mezőt egy modern dátumválasztó naptárrá (szövegesen vagy a kis naptár ikonra kattintva is írható). Amikor átváltasz zsidó irányba, a mező magától visszaváltozik tiszta számmá.
  • 2. Hajszálpontos nap és hónap: Ha beírod a képen látható 2026-06-17-et, az eredményjelző dobozaidban nem egy fixen odahamisított tavaszi érték fog megjelenni, hanem a valóságos zsidó újhónap: Zsidó év: 5786, Hónap: Tamuz, Nap: 2.
  • 3. Okos évszak-detektálás: A script figyeli, hogy az adott nap pontosan melyik zsidó hónapba esik. Ha tavaszi/nyári hónapot kap, akkor azt írja ki a megjegyzésbe, ha pedig őszi/téli hónapra kattint a felhasználó (pl. Kiszlév vagy Tévét), akkor a szöveg automatikusan átvált arra, hogy "Ez az időszak ősz/tél kategóriába esik."

Licencfeltételek (CC BY-NC-SA 4.0)

Ez a modul a Creative Commons Nevezd meg! - Ne add el! - Így add tovább! 4.0 (CC BY-NC-SA 4.0) nemzetközi licenc alatt áll.

Megengedett:

  • Ingyenes használat: Beépítheted saját személyes vagy üzleti célú weboldaladba teljesen díjmentesen.
  • Módosítás és testreszabás: A modul kódját szabadon átalakíthatod a saját weboldalad arculatára.

Nem megengedett:

  • Kereskedelmi értékesítés: Tilos a programot (vagy annak módosított változatát) önálló termékként eladni, bérbe adni vagy bármilyen módon haszonszerzés céljából értékesíteni.

Feltételek és támogatás:

A készítő az ingyenes verzióhoz technikai támogatást nem nyújt.


Jogi nyilatkozat és felelősségkizárás

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Magyar fordítás: A program „olyan-amilyen” alapon kerül használatra, minden közvetlen vagy közvetett garancia nélkül. A készítő nem szavatolja a naptár hibátlan működését vagy pontosságát. A használat során bekövetkezett esetleges károkért, adatvesztésért vagy hibákért kizárólag a felhasználó felelős, a szerző semmilyen esetben sem vonható felelősségre.

Letölthető html, css és script kódok

1. LÉPÉS: HTML kód (A megjelenő doboz szerkezete)
<section class="calc-box" aria-label="Héber-Gergely naptár konverter"><div class="calc-grid"><div class="calc-field flex-expand"><label for="calcDirection" class="calc-label">Konverzió iránya:</label><select id="calcDirection" onchange="switchDirection()" class="calc-select"><option value="gregToHeb">Világi év ➔ Zsidó év</option><option value="hebToGreg">Zsidó év ➔ Világi év</option></select></div><div class="calc-field flex-large"><label id="inputLabel" for="yearInput" class="calc-label">:</label><div class="calc-input-group"><input type="date" id="yearInput" value="2026-08-22" min="1" class="calc-input"><select id="eraSelect" class="calc-select select-era" aria-label="Időszámítás kiválasztása"><option value="AD">i.u.</option><option value="BC">i.e.</option></select></div></div></div><button type="button" onclick="convertCalendar()" class="btn-submit">Átszámítás elvégzése</button><div id="calcResult" class="calc-result-box"><span class="close-result" onclick="closeResult()">×</span><div id="dynamicBoxes"></div></div></section>
2. LÉPÉS: CSS kód (A formázás és mobilbarát dizájn)
.calc-box{background-color:#faf5ff;border:1px solid #e9d8fd;border-radius:8px;box-shadow:0 -12px 18px -6px rgba(233,216,253,0.5),0 12px 18px -6px rgba(233,216,253,0.7);padding:25px;margin:40px 0;position:relative}.preset-title{font-weight:700;margin-bottom:10px;color:#4a5568;font-size:.95em}.calc-grid{display:flex;flex-wrap:wrap;gap:15px;margin-bottom:20px}.calc-field{display:flex;flex-direction:column}.flex-expand{flex:1;min-width:200px}.flex-large{flex:1;min-width:220px}.calc-label{font-weight:100;margin-bottom:8px;color:#4a5568}.calc-input,.calc-select{width:100%;padding:12px;border-radius:6px;border:1px solid #cbd5e0;background-color:#fff;font-size:1.05em;box-sizing:border-box}.calc-input-group{display:flex;gap:5px}.calc-input{flex:1}.select-era{width:auto}.btn-submit{background-color:#6b46c1;color:#fff;border:none;padding:14px 25px;border-radius:6px;box-shadow:0 4px 6px -4px rgba(45,21,92,.5);font-weight:700;cursor:pointer;font-size:1.1em;width:100%;transition:background-color .2s ease}.btn-submit:hover{background-color:#553c9a}.calc-result-box{margin-top:20px;padding:18px;background-color:#fff;border-radius:6px;border-left:4px solid #805ad5;font-size:1.15em;display:none;line-height:1.55}#calcResult{display:none;max-width:520px;margin:20px auto;background-color:#fff;border-left:4px solid #805ad5;border-radius:8px;padding:20px;box-shadow:0 8px 20px rgba(0,0,0,.12);font-family:serif;line-height:1.6;position:relative}.result-box-wrapper{display:flex;justify-content:center;gap:15px;margin:20px auto;max-width:480px}.result-column{display:flex;flex-direction:column;align-items:center}.result-column:first-child .result-box{border:1px solid #d4af37;box-shadow:0 0 12px rgba(212,175,55,.35)}.result-label{font-size:.7em;color:#6b46c1;font-weight:500;margin-bottom:6px;text-transform:uppercase;letter-spacing:.5px}.result-box{background:#faf5ff;border:.5px solid #e9d8fd;border-radius:10px;padding:14px 20px;text-align:center;min-width:110px;font-size:1.15em;color:#2d3748;box-sizing:border-box;min-height:60px;display:flex;align-items:center;justify-content:center;opacity:1;transition:background-color .25s ease, box-shadow .25s ease;will-change:background-color, box-shadow}.result-box:hover{box-shadow:0 4px 12px rgba(0,0,0,.18);background:#fdfaff}
.result-column:nth-child(1) .result-box{animation-delay:0s}.result-column:nth-child(2) .result-box{animation-delay:.08s}.result-column:nth-child(3) .result-box{animation-delay:.16s}@keyframes boxFadeIn{0%{opacity:0;transform:translateY(10px);box-shadow:0 0 0 rgba(0,0,0,0)}100%{opacity:1;transform:translateY(0);box-shadow:0 3px 8px rgba(0,0,0,.12)}}.result-box-title{font-size:.9em;color:#6b46c1;font-weight:700;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.result-box-value{font-size:1.3em;color:#2d3748;font-family:"EB Garamond",serif}.close-result{position:relative;top:8px;right:12px;font-size:24px;font-weight:bold;color:#e53e3e;cursor:pointer;transition:.2s ease;z-index:10;width: 44px;height: 44px;display: flex;align-items: center;justify-content: center;}.close-result:hover{color:#000;transform:scale(1.15)}@media screen and (max-width:768px){.calc-grid{flex-direction:column;gap:12px}.flex-expand,.flex-large{width:100%;min-width:0}.btn-submit{padding:16px;font-size:1.15em}.calc-result-box{font-size:1.1em;padding:16px}}@media screen and (max-width:480px){.calc-input,.calc-select{font-size:1em;padding:10px}.btn-submit{font-size:1.05em;padding:14px}.result-box-wrapper{flex-direction:column;align-items:center;gap:10px;max-width:100%}.result-column{width:100%;max-width:280px}.result-box{width:100%;min-width:unset;box-shadow:0 3px 8px rgba(0,0,0,.08)}}
3. LÉPÉS: JavaScript kód (A naptár motorja)
<script>
document.addEventListener("DOMContentLoaded", () => {
    // Kombinált szótár: szám és angol szöveges kulcsok esetén is hibátlanul fordít magyarra!
    const hebMonthsHu = {
        1: "Niszán", 2: "Ijár", 3: "Sziván", 4: "Támuz", 5: "Áv", 6: "Elul",
        7: "Tisré", 8: "Hesván", 9: "Kiszlév", 10: "Tévét", 11: "Svát", 12: "Ádár", 13: "Ádár II.",
        "Nisan": "Niszán", "Iyar": "Ijár", "Sivan": "Sziván", "Tamuz": "Támuz", "Av": "Áv", "Elul": "Elul",
        "Tishrei": "Tisré", "Heshvan": "Hesván", "Kislev": "Kiszlév", "Tevet": "Tévét", "Shvat": "Svát", 
        "Adar": "Ádár", "Adar I": "Ádár I.", "Adar II": "Ádár II."
    };
    const weekDaysHu = ["Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat"];

    // 3. RUGALMAS DÁTUM-BEOLVASÓ (Szöveges és számos böngészőmotorokhoz egyaránt)
    function getHebrewDetails(date) {
        const formatter = new Intl.DateTimeFormat('en-US-u-ca-hebrew', {
            year: 'numeric', month: 'long', day: 'numeric'
        });
        const formatterNumeric = new Intl.DateTimeFormat('en-US-u-ca-hebrew', {
            year: 'numeric', month: 'numeric', day: 'numeric'
        });
        
        const parts = formatter.formatToParts(date);
        const partsNum = formatterNumeric.formatToParts(date);
        
        let day = 1, monthKey = "", year = 5786;
        
        // Először megpróbáljuk kinyerni a szöveges hónapnevet (pl. "Elul")
        parts.forEach(p => {
            if (p.type === 'day') day = parseInt(p.value, 10);
            if (p.type === 'month') monthKey = p.value;
            if (p.type === 'year') year = parseInt(p.value, 10);
        });
        
        // Ha a böngésző még a 'long' beállításra is számot adott vissza, átváltunk a numerikus indexre
        if (!isNaN(monthKey)) {
            partsNum.forEach(p => {
                if (p.type === 'month') monthKey = parseInt(p.value, 10);
            });
        }
        
        return { year, monthKey, day };
    }

    // 4. Matematikai napnyugta-kalkulátor Budapest földrajzi szélességére
    function getBudapestCandleTime(date) {
        const year = date.getFullYear();
        const month = date.getMonth();
        const day = date.getDate();
        
        const start = new Date(year, 0, 1);
        const diff = date - start;
        const dayOfYear = Math.floor(diff / (1000 * 60 * 60 * 24));
        
        const d = dayOfYear;
        let sunsetMinutesAfterMidnight = 1070 + 110 * Math.sin((2 * Math.PI * (d - 80)) / 365);
        
        let hrs = Math.floor(sunsetMinutesAfterMidnight / 60);
        let mins = Math.floor(sunsetMinutesAfterMidnight % 60);
        
        let sunset = new Date(year, month, day, hrs, mins, 0);
        sunset.setMinutes(sunset.getMinutes() - 18);
        return sunset;
    }

    // 5. Fő számítási folyamat a dátumok kitöltéséhez
    function updateSabatModule() {
        const now = new Date();
        const currentDayIdx = now.getDay();

        const todayHeb = getHebrewDetails(now);
        const resolvedMonthName = hebMonthsHu[todayHeb.monthKey] || todayHeb.monthKey;
        
        document.getElementById("sabatTodayHebrew").innerText = `${todayHeb.year}. ${resolvedMonthName} ${todayHeb.day}.`;
        document.getElementById("sabatTodayGregorian").innerText = `${now.getFullYear()}.${String(now.getMonth() + 1).padStart(2, '0')}.${String(now.getDate()).padStart(2, '0')}`;
        document.getElementById("sabatTodayName").innerText = weekDaysHu[currentDayIdx];

        let nextFriday = new Date(now);
        let distToFriday = (5 - currentDayIdx + 7) % 7;
        
        if (currentDayIdx === 5) {
            const todayCandle = getBudapestCandleTime(now);
            if (now >= todayCandle) {
                distToFriday = 7;
            }
        }
        nextFriday.setDate(now.getDate() + distToFriday);
        nextFriday.setHours(0, 0, 0, 0);

        const candleTime = getBudapestCandleTime(nextFriday);

        let nextSaturday = new Date(nextFriday);
        nextSaturday.setDate(nextFriday.getDate() + 1);
        
        const szombatNapnyugta = getBudapestCandleTime(nextSaturday);
        let sabatEndTime = new Date(szombatNapnyugta);
        sabatEndTime.setMinutes(sabatEndTime.getMinutes() + 58);

        document.getElementById("sabatNextGregorian").innerText = `${nextSaturday.getFullYear()}.${String(nextSaturday.getMonth() + 1).padStart(2, '0')}.${String(nextSaturday.getDate()).padStart(2, '0')}.`;

        document.getElementById("sabatCandleDate").innerText = `${candleTime.getFullYear()}.${String(candleTime.getMonth() + 1).padStart(2, '0')}.${String(candleTime.getDate()).padStart(2, '0')}`;
        document.getElementById("sabatCandleTime").innerText = `este ${candleTime.getHours()} óra ${String(candleTime.getMinutes()).padStart(2, '0')} perc`;

        let targetTime = candleTime;
        let isSabatNow = false;

        if (currentDayIdx === 5) {
            const todayCandle = getBudapestCandleTime(now);
            if (now >= todayCandle) {
                isSabatNow = true;
            }
        } else if (currentDayIdx === 6 && now < sabatEndTime) {
            isSabatNow = true;
        }

        if (isSabatNow) {
            document.getElementById("sabatStatusText").innerHTML = `<span style="color: #006600; font-weight: bold;">SÁBÁT ÜNNEP VAN!</span>`;
            document.getElementById("sabatCountdownTop").innerText = "Sábát szent szombatja tart, békés szombatot!";
        } else {
            document.getElementById("sabatStatusText").innerHTML = `<span style="color: #ff6666;">Nem Ünnepnap:</span> Munkanap!`;
            
            if (currentDayIdx === 5) {
                const todayCandle = getBudapestCandleTime(now);
                if (now < todayCandle) {
                    targetTime = todayCandle;
                }
            }

            let diff = targetTime - now;
            
            let diffDays = Math.floor(diff / (1000 * 60 * 60 * 24));
            let diffHours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
            let diffMinutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
            let diffSeconds = Math.floor((diff % (1000 * 60)) / 1000);

            document.getElementById("sabatCountdownTop").innerText = `${diffDays} nap, ${diffHours} óra, ${diffMinutes} perc, ${diffSeconds} másodperc`;
        }
    }

    updateSabatModule();
    setInterval(updateSabatModule, 1000);
});
</script>

Megjegyzés a kódok használatához

A naptár-box zökkenőmentes működése érdekében, vegyük figyelembe az alábbi beépítési útmutatót:

  • HTML kód: Ezt a strukturális részt a weboldal fő tartalmi elemébe kell beilleszteni, például a <main>, a .main-container vagy a kívánt aloldal tetszőleges konténerébe.
  • CSS kód: Ha közvetlenül a weboldal HTML fájljában használjuk, akkor a <style> és </style> jelölők közé kell másolni a dokumentum <head> szekcióján belül. Alternatív megoldásként a meglévő, külső stílusfájl (pl. style.css) végére is egyszerűen hozzáfűzhető.
  • Script kód: Ha a JavaScript kódot közvetlenül a HTML fájlba helyezzük, akkor a fenti másoló box teljes „script” tartalmát, változtatás nélkül, egyszerűen illesszük be a weboldal legaljára, közvetlenül a záró </body> tag elé.

Amennyiben különálló fájlként szeretnénk kezelni, hozzunk létre egy date-converter.js (lehet bármilyen név) állományt a gyökérkönyvtárban vagy a HTML fájl mellett, és hivatkozzunk rá a megfelelő elérési úttal. A hatékonyabb, aszinkron oldalbetöltés érdekében ajánlott a defer attribútum használata is.

Példa a modern beágyazásra: <script src="date-converter.js" defer></script>

Példa a kód elhelyezéséhez

Az alábbiak szerint illeszd be a fájlokat a megfelelő helyre:

  • CSS fájl: A <style> részbe kerül, mert itt definiálhatók a megjelenési stílusok, színek és elrendezések, amelyek a sábát modul vizuális formáját adják.
  • HTML fájl: A <body> szakaszban helyezkedik el, mivel ez tartalmazza a tényleges tartalmat. Ha a modul a <main> vagy .main-container részben van, akkor ide illeszd be, hogy a böngésző a fő tartalomként kezelje.
  • Script fájl: A <script> blokkban, a dokumentum végén kap helyet. Így a JavaScript csak a HTML betöltése után fut le, ami gyorsabb és stabilabb működést biztosít.
HTML kód elhelyezésének példája a sábát modulhoz
Kép 3: A fenti ábra bemutatja a fájlok elhelyezését. A CSS, HTML és Script részeket az itt látható módon illeszd be.

Összegzés

1. Gyors megoldás: A felső szakaszban található hebrew-shabbat-calendar.zip letöltésével azonnal hozzáférhetsz a teljes projektfájlhoz. Kicsomagolás után (például az Asztalra) a hebrew-shabbat-calendar.html megnyitható bármely kódszerkesztőben – például a Notepad++ alkalmazásban –, ahol a teljes forráskód és annak pontos HTML‑struktúrája egyben látható.

2. Hasznos tipp: A ZIP‑csomag letöltése után csomagold ki egy tetszőleges helyre (jobb gomb → „Kicsomagolás ide…”). A benne található hebrew-shabbat-calendar.html azonnal futtatható, így a Sábát naptár és a visszaszámláló alkalmazás bármikor elindítható a böngészőből, anélkül hogy újra meg kellene nyitni a weboldalt.

Kérdésed van? Írj a facebook oldalra.

Kacsó Károlyírta: Kacsó Károly. 2026. augusztus 26.| frissítve: – – –