Kako pretvoriti broj nedelje u opseg datuma — kompletan vodič
Neko ti pošalje raspored. „Isporuka u W23.” Otvoriš kalendar i gledaš u njega. Koji su to datumi, tačno?
Brojevi nedelja se koriste svuda u planiranju projekata, proizvodnji, maloprodaji i logistici — ali većina ljudi ih zna samo kao oznake. Pretvoriti broj nedelje nazad u stvarne kalendarske datume je manje intuitivno nego što bi trebalo, a slučajevi na prelazu godine zbunjuju čak i iskusne developere.
Ovaj vodič pokriva kompletnu konverziju: broj nedelje u ponedeljak, broj nedelje u ceo opseg (ponedeljak–nedelja) i obrnuto (datum u broj nedelje). Tu su i primeri koda za Python, JavaScript, Excel i SQL.
Šta broj nedelje zapravo govori
Pre bilo kakvog računanja, moraš znati koji sistem numerisanja nedelja je korišćen.
ISO 8601 (međunarodni standard): Nedelja 1 je nedelja koja sadrži prvi četvrtak u godini. Nedelje traju od ponedeljka do nedelje. Godina ima 52 ili 53 ISO nedelje. Ključno — ISO „nedeljna godina” može da se razlikuje od kalendarske godine. Poslednji dani decembra ponekad su u nedelji 1 sledeće godine.
Američki stil: Nedelja 1 sadrži 1. januar. Nedelje mogu ići od nedelje do subote ili od ponedeljka do nedelje, zavisno od alata. 1. januar je uvek u nedelji 1, bez izuzetaka.
U ostatku vodiča, „broj nedelje” znači ISO 8601 osim ako nije drugačije naglašeno. Ako ti je broj nedelje došao iz američki podešenog alata (npr. podrazumevani Excel WEEKNUM), formula je drugačija — vidi odeljak ispod.
Potrebna ti je i godina. „Nedelja 23” nema smisla bez nje. Uvek posmatraj nedelje kao par (godina, nedelja). Nedelja 23 u 2025 počinje 2. juna. Nedelja 23 u 2026 počinje 1. juna. Nedelja 1 u 2026 počinje 29. decembra 2025.
Osnovna formula: ISO broj nedelje u ponedeljak
Svaka ISO nedelja počinje u ponedeljak. Da nađeš ponedeljak ISO nedelje W u godini Y:
Ponedeljak = 4. januar godine Y + (W - 1) × 7 dana - dan_u_nedelji(4. januar godine Y) + 1
Logika: 4. januar je uvek u ISO nedelji 1 (po definiciji — u prva četiri dana godine, što garantuje da ta nedelja sadrži četvrtak). Nađeš ponedeljak nedelje koja sadrži 4. januar, pa se pomeriš unapred za (W - 1) nedelja.
Čistija ekvivalentna forma:
Ponedeljak W1 = 4. januar godine Y - dan_u_nedelji(4. januar godine Y) + 1
Ponedeljak W = Ponedeljak W1 + (W - 1) × 7
gde dan_u_nedelji vraća 1 za ponedeljak do 7 za nedelju (ISO numerisanje dana).
Primer: Nedelja 23 u 2026
- 4. januar 2026 je nedelja. ISO dan = 7.
- Ponedeljak W1: 4. jan − 7 + 1 = 29. decembar 2025.
- Ponedeljak W23: 29. dec 2025 + 22 × 7 = 29. dec + 154 dana = 1. jun 2026.
- Nedelja W23: 1. jun + 6 = 7. jun 2026.
Nedelja 23 u 2026 traje od 1. juna (ponedeljak) do 7. juna (nedelja).
Zamka na prelazu godine
Najčešća greška: pretpostaviti da nedelja 1 godine Y uvek počinje u godini Y.
Ne počinje.
Nedelja 1 je nedelja koja sadrži prvi četvrtak. Ako je taj četvrtak u ranim danima januara, ponedeljak nedelje 1 može biti u prethodnom decembru.
Primeri:
| ISO nedelja | Godina | Ponedeljak | Nedelja |
|---|---|---|---|
| W1 | 2025 | 30. decembar 2024 | 5. januar 2025 |
| W1 | 2026 | 29. decembar 2025 | 4. januar 2026 |
| W1 | 2027 | 4. januar 2027 | 10. januar 2027 |
| W1 | 2028 | 3. januar 2028 | 9. januar 2028 |
W1 u 2025 počinje u decembru 2024. W1 u 2026 počinje u decembru 2025.
To znači:
- 29–31. decembar 2025 su u ISO nedelji 1 za 2026, ne za 2025.
- Ako neko kaže „isporuka do W1 2026”, rok je nedelja koja počinje 29. decembra 2025.
Postoji i obrnuta zamka: poslednji dani nekih godina spadaju u nedelju 1 sledeće godine, ne u poslednju nedelju tekuće godine. Uvek koristi ISO nedeljnu godinu (Python format %G, isoyear u PostgreSQL-u) kada obeležavaš nedelju — ne kalendarsku godinu.
Ceo opseg datuma za bilo koji broj nedelje
Kada imaš ponedeljak, ostatak nedelje je trivijalan:
| Dan | Pomeraj od ponedeljka |
|---|---|
| Ponedeljak | +0 |
| Utorak | +1 |
| Sreda | +2 |
| Četvrtak | +3 |
| Petak | +4 |
| Subota | +5 |
| Nedelja | +6 |
Opseg za nedelju W je: [ponedeljak, ponedeljak + 6 dana].
Za radne dane (pon–pet): [ponedeljak, ponedeljak + 4 dana].
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 ima i ugrađeno za obrnuto (datum → ISO nedelja):
d = date(2026, 6, 4)
iso_year, iso_week, iso_weekday = d.isocalendar()
print(iso_year, iso_week) # 2026 23
Koristi d.isocalendar().year (ne d.year) kada ti treba ISO godina — razlikuju se na prelazu godine.
Za obrnuto dobijanje preko 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čistiji pristup ako koristiš Python 3.8 ili noviji.
JavaScript
JavaScript nema nativnu podršku za ISO nedelje. Ručna implementacija:
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
Korišćenje 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 ispravno rešava sve edge-case situacije i preporučen je pristup za produkcioni kod.
Excel i Google Sheets
Excel nema direktnu funkciju „broj nedelje → datum”, ali možeš da je napraviš formulom.
Ponedeljak ISO nedelje W u godini Y:
=DATE(Y,1,4) - WEEKDAY(DATE(Y,1,4),2) + 1 + (W-1)*7
Objašnjenje:
DATE(Y,1,4)— 4. januar godineWEEKDAY(DATE(Y,1,4),2)— dan u nedelji gde je ponedeljak=1, nedelja=7- oduzimanjem dobijaš ponedeljak nedelje 1
- dodavanjem
(W-1)*7ideš do ciljne nedelje
Za ceo opseg, nedelja je:
=Monday_formula + 6
Primer u tabeli (A1 = godina, B1 = broj nedelje):
Monday: =DATE(A1,1,4) - WEEKDAY(DATE(A1,1,4),2) + 1 + (B1-1)*7
Sunday: =Monday_cell + 6
Formatiraj obe ćelije kao datume. Za godinu 2026, nedelju 1, ovo vraća 29. decembar 2025 kao ponedeljak — što je tačno.
Obrnuto (datum → ISO nedelja): Koristi ISOWEEKNUM(date). Za ISO godinu, koristi workaround iz članka o ISOWEEKNUM, pošto Excel nema nativnu funkciju za ISO godinu.
SQL
PostgreSQL ima najpotpuniju ISO podršku:
-- 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;
Čistiji pristup uz to_date i ISO format kodove:
-- 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)
Ovo je najjednostavniji PostgreSQL pristup: formatiraš string YYYYWWD i parsiraš ga ISO format kodovima.
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-stil: broj nedelje u datume
Ako ti je broj nedelje došao iz US stila (nedelja 1 sadrži 1. januar, nedelje počinju u nedelju ili ponedeljak), formula je jednostavnija jer nema zamke na granici godine:
Početak nedelje (nedeljom):
Week_start = DATE(Y, 1, 1) + (W - 1) × 7 - WEEKDAY(DATE(Y, 1, 1), 1)
gde WEEKDAY vraća 1 za nedelju do 7 za subotu.
Ali US brojevi nedelja su mnogo ređi u rasporedima i logistici nego ISO. Ako ti neko da broj nedelje bez sistema, pretpostavi ISO — posebno u međunarodnom ili evropskom poslovnom kontekstu.
Brzi pregled za 2026: ISO nedelje 1–10 i 48–53
| ISO nedelja | Godina | Ponedeljak | Nedelja |
|---|---|---|---|
| W1 | 2026 | 29. dec 2025 | 4. jan 2026 |
| W2 | 2026 | 5. jan 2026 | 11. jan 2026 |
| W3 | 2026 | 12. jan 2026 | 18. jan 2026 |
| W4 | 2026 | 19. jan 2026 | 25. jan 2026 |
| W5 | 2026 | 26. jan 2026 | 1. feb 2026 |
| W6 | 2026 | 2. feb 2026 | 8. feb 2026 |
| W7 | 2026 | 9. feb 2026 | 15. feb 2026 |
| W8 | 2026 | 16. feb 2026 | 22. feb 2026 |
| W9 | 2026 | 23. feb 2026 | 1. mar 2026 |
| W10 | 2026 | 2. mar 2026 | 8. mar 2026 |
| ... | |||
| W48 | 2026 | 23. nov 2026 | 29. nov 2026 |
| W49 | 2026 | 30. nov 2026 | 6. dec 2026 |
| W50 | 2026 | 7. dec 2026 | 13. dec 2026 |
| W51 | 2026 | 14. dec 2026 | 20. dec 2026 |
| W52 | 2026 | 21. dec 2026 | 27. dec 2026 |
| W53 | 2026 | 28. dec 2026 | 3. jan 2027 |
Obrati pažnju: W1 u 2026 počinje 29. decembra 2025. I W53 u 2026 se završava 3. januara 2027 — 2026 je godina sa 53 nedelje.
Najčešće greške ukratko
Bez godine. „Nedelja 8” je dvosmisleno. Uvek koristi format 2026-W08 ili ekvivalent.
Kalendarska godina umesto ISO nedeljne godine. 29. decembar 2025 je u ISO nedelji 1 za 2026, ne 2025. Ako je sačuvaš pod 2025, u pogrešnoj je grupi.
Pretpostavka da nedelja 1 počinje 1. januara. Često počinje 29, 30 ili 31. decembra. Ako želiš da 1. januar uvek bude u nedelji 1, koristiš US sistem, ne ISO.
Off-by-one u formuli za ponedeljak. Sidro 4. januar je bitno — ne 1. januar (koji može biti u poslednjoj nedelji prethodne godine). Ako koristiš 1. januar kao sidro, dobijaš pogrešne rezultate u godinama kada 1. januar pada kasno u nedelji.
Bez testiranja datuma na granici godine. Svaki kod za datume treba testirati na 28–31. decembar i 1–4. januar. Tih nekoliko dana je mesto gde su svi edge-case scenariji.
Koristi ISO kalkulator broja nedelje da nađeš opseg datuma za bilo koji broj nedelje, ili proveri trenutni broj nedelje i današnji ISO opseg datuma.