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ýden | Rok | Pondělí | Neděle |
|---|---|---|---|
| T1 | 2025 | 30. prosinec 2024 | 5. leden 2025 |
| T1 | 2026 | 29. prosinec 2025 | 4. leden 2026 |
| T1 | 2027 | 4. leden 2027 | 10. leden 2027 |
| T1 | 2028 | 3. leden 2028 | 9. 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í:
| Den | Offset 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 rokuWEEKDAY(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)*7př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ýden | Rok | Pondělí | Neděle |
|---|---|---|---|
| T1 | 2026 | 29. prosinec 2025 | 4. leden 2026 |
| T2 | 2026 | 5. leden 2026 | 11. leden 2026 |
| T3 | 2026 | 12. leden 2026 | 18. leden 2026 |
| T4 | 2026 | 19. leden 2026 | 25. leden 2026 |
| T5 | 2026 | 26. leden 2026 | 1. únor 2026 |
| T6 | 2026 | 2. únor 2026 | 8. únor 2026 |
| T7 | 2026 | 9. únor 2026 | 15. únor 2026 |
| T8 | 2026 | 16. únor 2026 | 22. únor 2026 |
| T9 | 2026 | 23. únor 2026 | 1. březen 2026 |
| T10 | 2026 | 2. březen 2026 | 8. březen 2026 |
| ... | |||
| T48 | 2026 | 23. listopad 2026 | 29. listopad 2026 |
| T49 | 2026 | 30. listopad 2026 | 6. prosinec 2026 |
| T50 | 2026 | 7. prosinec 2026 | 13. prosinec 2026 |
| T51 | 2026 | 14. prosinec 2026 | 20. prosinec 2026 |
| T52 | 2026 | 21. prosinec 2026 | 27. prosinec 2026 |
| T53 | 2026 | 28. prosinec 2026 | 3. 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.

