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 nedeljaGodinaPonedeljakNedelja
W1202530. decembar 20245. januar 2025
W1202629. decembar 20254. januar 2026
W120274. januar 202710. januar 2027
W120283. januar 20289. 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:

DanPomeraj 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 godine
  • WEEKDAY(DATE(Y,1,4),2) — dan u nedelji gde je ponedeljak=1, nedelja=7
  • oduzimanjem dobijaš ponedeljak nedelje 1
  • dodavanjem (W-1)*7 ideš 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 nedeljaGodinaPonedeljakNedelja
W1202629. dec 20254. jan 2026
W220265. jan 202611. jan 2026
W3202612. jan 202618. jan 2026
W4202619. jan 202625. jan 2026
W5202626. jan 20261. feb 2026
W620262. feb 20268. feb 2026
W720269. feb 202615. feb 2026
W8202616. feb 202622. feb 2026
W9202623. feb 20261. mar 2026
W1020262. mar 20268. mar 2026
...
W48202623. nov 202629. nov 2026
W49202630. nov 20266. dec 2026
W5020267. dec 202613. dec 2026
W51202614. dec 202620. dec 2026
W52202621. dec 202627. dec 2026
W53202628. dec 20263. 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.