Jak převést číslo týdne na rozsah dat — Kompletní průvodce

Někdo vám pošle plán. „Dodávka v T23." Otevřete kalendář a zíráte na něj. Jaká data to přesně jsou?

Čísla týdnů se používají všude v projektovém plánování, výrobě, maloobchodu a logistice — ale většina lidí je zná jen jako označení. Převod čísla týdne zpět na skutečná data v kalendáři je méně intuitivní, než by měl být, a případy na hranici roku zaskočí i zkušené vývojáře.

Tento průvodce pokrývá úplnou konverzi: číslo týdne na pondělí, číslo týdne na celý rozsah dat (pondělí–neděle), a opak (datum na číslo týdne). S kódem pro Python, JavaScript, Excel a SQL.

Co vám číslo týdne skutečně říká

Před výpočtem čehokoli musíte vědět, ze kterého systému číslování týdnů číslo pochází.

ISO 8601 (mezinárodní standard): Týden 1 je týden obsahující první čtvrtek roku. Týdny probíhají od pondělí do neděle. Rok má 52 nebo 53 ISO týdnů. Důležité — rok ISO týdne se může lišit od kalendářního roku. Poslední dny prosince jsou někdy v týdnu 1 následujícího roku.

Americký styl: Týden 1 obsahuje 1. ledna. Týdny mohou probíhat od neděle do soboty nebo od pondělí do neděle v závislosti na nástroji. 1. ledna je vždy v týdnu 1, bez výjimek.

Pro zbytek tohoto průvodce „číslo týdne" znamená ISO 8601, pokud není uvedeno jinak. Pokud vám někdo dal číslo týdne z nástroje ve stylu USA (jako je výchozí Excel WEEKNUM), vzorec konverze je jiný — viz sekce níže.

Potřebujete také rok. „Týden 23" je bez roku bezvýznamný. Vždy zacházejte s čísly týdnů jako s párem (rok, týden). Týden 23 roku 2025 začíná 2. června. Týden 23 roku 2026 začíná 1. června. Týden 1 roku 2026 začíná 29. prosince roku 2025.

Základní vzorec: číslo ISO týdne na pondělí

Každý ISO týden začíná v pondělí. Chcete-li najít pondělí ISO týdne T v roce R:

Pondělí = 4. ledna roku R + (T - 1) × 7 dní - den_v_týdnu(4. ledna roku R) + 1

Zdůvodnění: 4. ledna je vždy v ISO týdnu 1 (podle definice — je v prvních čtyřech dnech roku, což zaručuje, že týden obsahuje čtvrtek). Najděte pondělí týdne obsahujícího 4. ledna, pak postupte o (T - 1) týdnů vpřed.

Čistší ekvivalent:

Pondělí T1 = 4. ledna roku R - den_v_týdnu(4. ledna roku R) + 1
Pondělí T  = Pondělí T1 + (T - 1) × 7

kde den_v_týdnu vrací 1 pro pondělí až 7 pro neděli (ISO číslování dní v týdnu).

Příklad: Týden 23 roku 2026

  • 4. ledna 2026 je neděle. ISO den v týdnu = 7.
  • Pondělí T1: 4. leden − 7 + 1 = 29. prosinec 2025.
  • Pondělí T23: 29. prosinec 2025 + 22 × 7 = 29. prosinec + 154 dní = 1. červen 2026.
  • Neděle T23: 1. červen + 6 = 7. červen 2026.

Týden 23 roku 2026 probíhá od 1. června (pondělí) do 7. června (neděle).

Past na hranici roku

Nejčastější chyba: předpoklad, že týden 1 roku R vždy začíná v roce R.

Není to tak.

Týden 1 roku je týden obsahující první čtvrtek. Pokud je tento čtvrtek v začátku ledna, pondělí týdne 1 může připadnout na předchozí prosinec.

Příklady:

ISO týdenRokPondělíNeděle
T1202530. prosinec 20245. leden 2025
T1202629. prosinec 20254. leden 2026
T120274. leden 202710. leden 2027
T120283. leden 20289. leden 2028

T1 roku 2025 začíná v prosinci 2024. T1 roku 2026 začíná v prosinci 2025.

To znamená:

  • 29.–31. prosinec 2025 jsou v ISO týdnu 1 roku 2026, ne 2025.
  • Pokud někdo říká „dodat do T1 2026," termín je týden začínající 29. prosince 2025.

Opačná past také existuje: poslední dny některých let připadají do týdne 1 následujícího roku, nikoli do posledního týdne aktuálního roku. Vždy používejte rok ISO týdne (formátovací kód %G v Pythonu, isoyear v PostgreSQL) při označování týdne — ne kalendářní rok.

Celý rozsah dat pro libovolné číslo týdne

Jakmile máte pondělí, zbytek týdne je triviální:

DenOffset od pondělí
Pondělí+0
Úterý+1
Středa+2
Čtvrtek+3
Pátek+4
Sobota+5
Neděle+6

Rozsah dat pro týden T je: [Pondělí, Pondělí + 6 dní].

Pro pracovní dny (pouze Po–Pá): [Pondělí, Pondělí + 4 dny].

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á také vestavěnou metodu pro opak (datum na ISO týden):

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

Použijte d.isocalendar().year (ne d.year), když potřebujete rok ISO — na hranicích roku se liší.

Pro zpětné vyhledávání pomocí 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 nejčistší přístup, pokud používáte Python 3.8 nebo novější.

JavaScript

JavaScript nemá nativní podporu ISO týdnů. Ruční implementace:

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

Pomocí 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ávně zpracovává všechny hraniční případy a je doporučeným přístupem pro produkční kód.

Excel a Google Sheets

Excel nemá přímou funkci „číslo týdne na datum", ale můžete ji sestavit pomocí vzorce.

Pondělí ISO týdne T v roce R:

=DATE(R,1,4) - WEEKDAY(DATE(R,1,4),2) + 1 + (T-1)*7

Rozložení:

  • DATE(R,1,4) — 4. ledna roku
  • WEEKDAY(DATE(R,1,4),2) — den v týdnu kde pondělí=1, neděle=7
  • Odečtení dá pondělí týdne 1
  • Přidání (T-1)*7 přesune na cílový týden

Pro celý rozsah je neděle jednoduše:

=vzorec_pondělí + 6

Příklad v tabulce (kde A1 = rok, B1 = číslo týdne):

Pondělí: =DATE(A1,1,4) - WEEKDAY(DATE(A1,1,4),2) + 1 + (B1-1)*7
Neděle: =buňka_pondělí + 6

Formátujte obě buňky jako data. Pro rok 2026, týden 1 vrátí 29. prosinec 2025 pro pondělí — což je správně.

Opak (datum na číslo ISO týdne): Použijte ISOWEEKNUM(datum). Pro rok ISO použijte řešení z článku ISOWEEKNUM, protože Excel nemá nativní funkci pro rok ISO.

SQL

PostgreSQL má nejkompletnější podporu ISO:

-- 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;

Čistší přístup pomocí PostgreSQL to_date s formátovacími kódy ISO:

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

Toto je nejjednodušší přístup v PostgreSQL: formátujte řetězec RRRRTTD a parsujte ho s formátovacími kódy ISO.

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

Číslo týdne amerického stylu na data

Pokud vaše číslo týdne pochází z amerického systému (týden 1 = obsahuje 1. ledna, týdny začínají nedělí nebo pondělím), vzorec je jednodušší, protože neexistuje problém s hranicí roku:

Začátek týdne (neděle jako základ):

Začátek_týdne = DATE(R, 1, 1) + (T - 1) × 7 - WEEKDAY(DATE(R, 1, 1), 1)

kde WEEKDAY vrací 1 pro neděli až 7 pro sobotu.

Ale čísla týdnů amerického stylu jsou v plánování a logistice mnohem méně běžná než ISO. Pokud vám někdo dá číslo týdne bez specifikace systému, předpokládejte ISO — zejména v mezinárodních nebo evropských obchodních kontextech.

Stručná reference pro rok 2026: ISO týdny 1–10 a 48–53

ISO týdenRokPondělíNeděle
T1202629. prosinec 20254. leden 2026
T220265. leden 202611. leden 2026
T3202612. leden 202618. leden 2026
T4202619. leden 202625. leden 2026
T5202626. leden 20261. únor 2026
T620262. únor 20268. únor 2026
T720269. únor 202615. únor 2026
T8202616. únor 202622. únor 2026
T9202623. únor 20261. březen 2026
T1020262. březen 20268. březen 2026
...
T48202623. listopad 202629. listopad 2026
T49202630. listopad 20266. prosinec 2026
T5020267. prosinec 202613. prosinec 2026
T51202614. prosinec 202620. prosinec 2026
T52202621. prosinec 202627. prosinec 2026
T53202628. prosinec 20263. leden 2027

Všimněte si, že T1 roku 2026 začíná 29. prosince 2025. T53 roku 2026 končí 3. ledna 2027 — 2026 je rok s 53 týdny.

Shrnutí běžných chyb

Nezahrnutí roku. „Týden 8" je nejednoznačný. Vždy používejte formát 2026-T08 nebo ekvivalent.

Použití kalendářního roku místo roku ISO týdne. 29. prosinec 2025 je v ISO týdnu 1 roku 2026, ne 2025. Uložení pod rok 2025 ho umístí do špatného segmentu.

Předpoklad, že týden 1 začíná 1. ledna. Začíná 29., 30. nebo 31. prosince v mnoha letech. Pokud potřebujete, aby 1. ledna byl vždy v týdnu 1, používáte americký systém, ne ISO.

Chyba o jedna ve vzorci pro pondělí. Kotevní datum 4. ledna je důležité — ne 1. ledna (který může být v posledním týdnu předchozího roku). Použití 1. ledna jako kotvy dává špatné výsledky v letech, kdy 1. ledna připadá pozdě v týdnu.

Netestování dat na hranici roku. Jakýkoli kód pro práci s daty by měl být testován na 28.–31. prosinec a 1.–4. ledna. Těchto čtyři až sedm dní je místo, kde žijí všechny hraniční případy.

Použijte Kalkulátor čísla ISO týdne pro vyhledání rozsahu dat pro libovolné číslo týdne, nebo zkontrolujte aktuální číslo týdne a dnešní rozsah dat ISO týdne.