Ako previesť číslo týždňa na dátumový rozsah — kompletný návod

Niekto vám pošle harmonogram. „Dodanie v W23.“ Otvoríte kalendár a pozeráte. Aké presné dátumy to sú?

Čísla týždňov sa používajú všade v plánovaní projektov, výrobe, maloobchode a logistike — ale väčšina ľudí ich pozná len ako štítky. Prevod čísla týždňa späť na konkrétne kalendárne dni je menej intuitívny, než by mal byť, a prípady na prelome rokov potrápia aj skúsených vývojárov.

Tento návod pokrýva celý prevod: číslo týždňa na pondelok, číslo týždňa na celý rozsah (pondelok–nedeľa) a aj opačný smer (dátum → číslo týždňa). Pridáva kód pre Python, JavaScript, Excel a SQL.

Čo vám číslo týždňa vlastne hovorí

Skôr než začnete počítať, musíte vedieť, z akého systému číslovania týždňov číslo pochádza.

ISO 8601 (medzinárodný štandard): Týždeň 1 je týždeň, ktorý obsahuje prvý štvrtok v roku. Týždne bežia od pondelka do nedele. Rok má 52 alebo 53 ISO týždňov. Dôležité: ISO rok týždňa sa môže líšiť od kalendárneho roka. Posledné dni decembra môžu patriť do týždňa 1 nasledujúceho ISO roka.

USA štýl: Týždeň 1 obsahuje 1. január. Týždne môžu byť nedeľa–sobota alebo pondelok–nedeľa podľa nástroja. 1. január je vždy v týždni 1.

V zvyšku tohto návodu znamená „číslo týždňa“ ISO 8601, pokiaľ nie je uvedené inak. Ak číslo prišlo z US nástroja (napr. predvolené Excel WEEKNUM), vzorec je iný — pozrite sekciu nižšie.

Potrebujete aj rok. „Týždeň 23“ bez roka je bez významu. Vždy berte týždne ako dvojicu (rok, týždeň). Týždeň 23 v 2025 začína 2. júna. Týždeň 23 v 2026 začína 1. júna. A týždeň 1 v 2026 začína 29. decembra 2025.

Základný vzorec: ISO číslo týždňa → pondelok

Každý ISO týždeň začína pondelkom. Ak chcete nájsť pondelok ISO týždňa W v roku Y:

Pondelok = 4. január v roku Y + (W - 1) × 7 dní - weekday(4. január v roku Y) + 1

Logika: 4. január je vždy v ISO týždni 1 (z definície). Nájdite pondelok týždňa, v ktorom leží 4. január, a potom sa posuňte o (W - 1) týždňov.

Čistejšia ekvivalencia:

Pondelok W1 = 4. január v roku Y - weekday(4. január v roku Y) + 1
Pondelok W  = Pondelok W1 + (W - 1) × 7

kde weekday vracia 1 pre pondelok až 7 pre nedeľu (ISO číslovanie dňa v týždni).

Príklad: týždeň 23 v roku 2026

  • 4. január 2026 je nedeľa. ISO weekday = 7.
  • Pondelok W1: 4. január − 7 + 1 = 29. december 2025.
  • Pondelok W23: 29. december 2025 + 22 × 7 = 29. december + 154 dní = 1. jún 2026.
  • Nedeľa W23: 1. jún + 6 = 7. jún 2026.

Týždeň 23 v roku 2026 je od 1. júna (pondelok) do 7. júna (nedeľa).

Pasca na prelome rokov

Najčastejšia chyba: predpokladať, že týždeň 1 v roku Y vždy začína v roku Y.

Nezačína.

Týždeň 1 je týždeň, ktorý obsahuje prvý štvrtok v roku. Ak je ten štvrtok na začiatku januára, pondelok týždňa 1 môže spadnúť do predchádzajúceho decembra.

Príklady:

ISO WeekYearMondaySunday
W12025December 30, 2024January 5, 2025
W12026December 29, 2025January 4, 2026
W12027January 4, 2027January 10, 2027
W12028January 3, 2028January 9, 2028

W1 v 2025 začína v decembri 2024. W1 v 2026 začína v decembri 2025.

To znamená:

  • 29.–31. december 2025 patrí do ISO týždňa 1 roku 2026, nie 2025.
  • Ak niekto povie „dodanie do W1 2026“, termín je týždeň začínajúci 29. decembra 2025.

Existuje aj opačná pasca: posledné dni niektorých rokov patria do týždňa 1 nasledujúceho ISO roka, nie do posledného týždňa aktuálneho roka. Vždy používajte ISO rok týždňa (%G v Pythone, isoyear v PostgreSQL), nie kalendárny rok.

Celý dátumový rozsah pre ľubovoľné číslo týždňa

Keď máte pondelok, zvyšok je jednoduchý:

DeňPosun od pondelka
Pondelok+0
Utorok+1
Streda+2
Štvrtok+3
Piatok+4
Sobota+5
Nedeľa+6

Rozsah pre týždeň W je: [pondelok, pondelok + 6 dní].

Pre pracovné dni (po–pi): [pondelok, pondelok + 4 dni].

Python

from datetime import date, timedelta

def iso_week_to_monday(year: int, week: int) -> date:
    # Jan 4 is always in ISO week 1
    jan4 = date(year, 1, 4)
    # Move back to Monday of that week
    week1_monday = jan4 - timedelta(days=jan4.weekday())
    # Step forward to the target week
    return week1_monday + timedelta(weeks=week - 1)

def iso_week_to_range(year: int, week: int) -> tuple[date, date]:
    monday = iso_week_to_monday(year, week)
    sunday = monday + timedelta(days=6)
    return monday, sunday

# Examples
monday, sunday = iso_week_to_range(2026, 23)
print(monday)   # 2026-06-01
print(sunday)   # 2026-06-07

monday, sunday = iso_week_to_range(2026, 1)
print(monday)   # 2025-12-29  ← note: starts in 2025
print(sunday)   # 2026-01-04

Python má aj vstavaný opačný smer (dátum → ISO týždeň):

d = date(2026, 6, 4)
iso_year, iso_week, iso_weekday = d.isocalendar()
print(iso_year, iso_week)  # 2026 23

Použite d.isocalendar().year (nie d.year) keď potrebujete ISO rok — na prelome rokov sa môžu líšiť.

Opačný smer pomocou fromisocalendar (Python 3.8+):

# Get Monday of ISO week 23, 2026 directly
monday = date.fromisocalendar(2026, 23, 1)  # weekday 1 = Monday
print(monday)  # 2026-06-01

date.fromisocalendar(year, week, weekday) je najčistejší prístup, ak máte Python 3.8 alebo novší.

JavaScript

JavaScript nemá natívnu podporu ISO týždňov. Manuálna implementácia:

function isoWeekToMonday(year, week) {
  // Jan 4 is always in ISO week 1
  const jan4 = new Date(year, 0, 4)
  const dayOfWeek = jan4.getDay() || 7  // convert Sun=0 to 7
  const week1Monday = new Date(jan4)
  week1Monday.setDate(jan4.getDate() - dayOfWeek + 1)
  
  const monday = new Date(week1Monday)
  monday.setDate(week1Monday.getDate() + (week - 1) * 7)
  return monday
}

function isoWeekToRange(year, week) {
  const monday = isoWeekToMonday(year, week)
  const sunday = new Date(monday)
  sunday.setDate(monday.getDate() + 6)
  return { monday, sunday }
}

// Examples
const { monday, sunday } = isoWeekToRange(2026, 23)
console.log(monday.toISOString().slice(0, 10))  // 2026-06-01
console.log(sunday.toISOString().slice(0, 10))  // 2026-06-07

const w1 = isoWeekToRange(2026, 1)
console.log(w1.monday.toISOString().slice(0, 10))  // 2025-12-29

Použitie date-fns:

import { setISOWeek, setISOWeekYear, startOfISOWeek, endOfISOWeek } from 'date-fns'

function isoWeekToRange(year, week) {
  let d = new Date(year, 0, 4)  // any date in the target year
  d = setISOWeekYear(d, year)
  d = setISOWeek(d, week)
  return {
    monday: startOfISOWeek(d),
    sunday: endOfISOWeek(d)
  }
}

date-fns správne rieši všetky okrajové prípady a je odporúčaný pre produkčný kód.

Excel a Google Sheets

Excel nemá priamu funkciu „číslo týždňa → dátum“, ale dá sa poskladať vzorcom.

Pondelok ISO týždňa W v roku Y:

=DATE(Y,1,4) - WEEKDAY(DATE(Y,1,4),2) + 1 + (W-1)*7

Rozpis:

  • DATE(Y,1,4) — 4. január daného roka
  • WEEKDAY(DATE(Y,1,4),2) — deň v týždni, kde pondelok=1, nedeľa=7
  • odčítanie dá pondelok týždňa 1
  • (W-1)*7 posunie na cieľový týždeň

Pre celý rozsah je nedeľa:

=Monday_formula + 6

Príklad v tabuľke (A1 = rok, B1 = číslo týždňa):

Monday: =DATE(A1,1,4) - WEEKDAY(DATE(A1,1,4),2) + 1 + (B1-1)*7
Sunday: =Monday_cell + 6

Formátujte bunky ako dátumy. Pre rok 2026, týždeň 1, vzorec vráti 29. december 2025 pre pondelok — čo je správne.

Opačný smer (dátum → ISO týždeň): použite ISOWEEKNUM(date). Pre ISO rok použite workaround z článku o ISOWEEKNUM, keďže Excel nemá natívnu funkciu ISO roka.

SQL

PostgreSQL má najkompletnejšiu ISO podporu:

-- Monday of ISO week W in year Y
SELECT
  make_date(2026, 1, 4)
    + (23 - 1) * 7  -- step to week 23
    - EXTRACT(isodow FROM make_date(2026, 1, 4))::int + 1
    AS week_monday;
-- 2026-06-01

-- Or more cleanly using generate_series for a range lookup
SELECT
  d::date AS week_monday,
  (d + 6)::date AS week_sunday,
  EXTRACT(isoyear FROM d) AS iso_year,
  EXTRACT(week FROM d) AS iso_week
FROM generate_series(
  DATE '2026-01-01',
  DATE '2026-12-31',
  INTERVAL '7 days'
) d
WHERE EXTRACT(week FROM d) = 23
  AND EXTRACT(isoyear FROM d) = 2026;

Najjednoduchší prístup cez to_date s ISO formátmi:

-- Convert ISO year + week to Monday
SELECT to_date('2026' || '23' || '1', 'IYYYIWid') AS monday;
-- 2026-06-01

-- Format: IYYY=ISO year, IW=ISO week, id=ISO day (1=Monday)

MySQL:

-- Monday of ISO week 23, 2026
SELECT STR_TO_DATE('202623 Monday', '%X%V %W');
-- 2026-06-01

-- Or step-based:
SELECT DATE_ADD(
  DATE_ADD(STR_TO_DATE('2026-01-04', '%Y-%m-%d'),
    INTERVAL (-(WEEKDAY(STR_TO_DATE('2026-01-04', '%Y-%m-%d')))) DAY),
  INTERVAL (23 - 1) * 7 DAY
) AS week_monday;

SQL Server:

-- Monday of ISO week 23, 2026
DECLARE @year INT = 2026, @week INT = 23

SELECT DATEADD(
  DAY,
  (@week - 1) * 7
    - (DATEPART(WEEKDAY, DATEFROMPARTS(@year, 1, 4)) + 5) % 7,
  DATEFROMPARTS(@year, 1, 4)
) AS week_monday;
-- 2026-06-01

US štýl: číslo týždňa → dátumy

Ak číslo týždňa pochádza z US systému (týždeň 1 = obsahuje 1. január, týždne začínajú v nedeľu alebo pondelok), vzorec je jednoduchší, pretože nemá ISO pasce na prelome rokov:

Začiatok týždňa (nedeľný štart):

Week_start = DATE(Y, 1, 1) + (W - 1) × 7 - WEEKDAY(DATE(Y, 1, 1), 1)

kde WEEKDAY vracia 1 pre nedeľu až 7 pre sobotu.

US týždne sú však v plánovaní a logistike oveľa menej bežné ako ISO. Ak vám niekto dá číslo týždňa bez uvedenia systému, predpokladajte ISO — najmä v medzinárodnom alebo európskom kontexte.

Rýchla referencia 2026: ISO týždne 1–10 a 48–53

ISO WeekYearMondaySunday
W12026Dec 29, 2025Jan 4, 2026
W22026Jan 5, 2026Jan 11, 2026
W32026Jan 12, 2026Jan 18, 2026
W42026Jan 19, 2026Jan 25, 2026
W52026Jan 26, 2026Feb 1, 2026
W62026Feb 2, 2026Feb 8, 2026
W72026Feb 9, 2026Feb 15, 2026
W82026Feb 16, 2026Feb 22, 2026
W92026Feb 23, 2026Mar 1, 2026
W102026Mar 2, 2026Mar 8, 2026
...
W482026Nov 23, 2026Nov 29, 2026
W492026Nov 30, 2026Dec 6, 2026
W502026Dec 7, 2026Dec 13, 2026
W512026Dec 14, 2026Dec 20, 2026
W522026Dec 21, 2026Dec 27, 2026
W532026Dec 28, 2026Jan 3, 2027

Všimnite si, že W1 v 2026 začína 29. decembra 2025. A W53 v 2026 končí 3. januára 2027 — 2026 je 53-týždňový rok.

Zhrnutie najčastejších chýb

Chýba rok. „Týždeň 8“ je nejednoznačný. Vždy používajte formát 2026-W08 alebo ekvivalent.

Používanie kalendárneho roka namiesto ISO roka týždňa. 29. december 2025 je v ISO týždni 1 roku 2026, nie 2025. Ak ho uložíte pod 2025, skončí v nesprávnom koši.

Predpoklad, že týždeň 1 začína 1. januára. V mnohých rokoch začína 29., 30. alebo 31. decembra. Ak potrebujete, aby 1. január bol vždy v týždni 1, používate US systém, nie ISO.

Off-by-one pri vzorci s pondelkom. Kotva 4. január je kľúčová — nie 1. január (ktorý môže patriť do posledného týždňa predchádzajúceho ISO roka). Kotvenie na 1. január dáva zlé výsledky v rokoch, keď 1. január padne neskoro v týždni.

Netestovanie dátumov na prelome rokov. Akýkoľvek kód na prácu s dátumami by mal byť otestovaný na 28.–31. decembra a 1.–4. januára. Práve v týchto dňoch žijú všetky okrajové prípady.

Použite ISO Week Number Calculator na vyhľadanie dátumového rozsahu pre ľubovoľné číslo týždňa alebo si pozrite current week number a dnešný ISO rozsah.