Jinsi ya Kubadilisha Namba ya Wiki kuwa Masafa ya Tarehe — Mwongozo Kamili

Mtu anakutumia ratiba. “Uwasilishaji wiki W23.” Unafungua kalenda yako na kutazama. Hiyo ni tarehe gani hasa?

Namba za wiki hutumika kila mahali katika upangaji wa miradi, uzalishaji, rejareja, na lojistiki — lakini watu wengi huzijua kama lebo tu. Kubadilisha namba ya wiki kurudi kwenye tarehe za kalenda si jambo la moja kwa moja, na kesi za mipaka ya mwaka huwakwaza hata watengenezaji wenye uzoefu.

Mwongozo huu unafunika ubadilishaji kamili: namba ya wiki hadi Jumatatu, namba ya wiki hadi masafa kamili ya tarehe (Jumatatu–Jumapili), na kinyume chake (tarehe hadi namba ya wiki). Pia una mifano ya msimbo kwa Python, JavaScript, Excel, na SQL.

Namba ya Wiki Inakuambia Nini Hasa

Kabla ya kuhesabu chochote, unahitaji kujua mfumo wa kuhesabu wiki ambao namba hiyo imetoka.

ISO 8601 (kiwango cha kimataifa): Wiki ya 1 ni wiki iliyo na Alhamisi ya kwanza ya mwaka. Wiki huenda Jumatatu hadi Jumapili. Mwaka una wiki 52 au 53 za ISO. Muhimu sana — mwaka wa wiki wa ISO unaweza kutofautiana na mwaka wa kalenda. Siku za mwisho za Desemba wakati mwingine huwa kwenye Wiki ya 1 ya mwaka unaofuata.

Mtindo wa Marekani (US-style): Wiki ya 1 ni wiki iliyo na Januari 1. Wiki zinaweza kuwa Jumapili hadi Jumamosi au Jumatatu hadi Jumapili kutegemea zana. Januari 1 huwa kwenye wiki ya 1 kila mara, bila ubaguzi.

Kwa sehemu iliyobaki ya mwongozo huu, “namba ya wiki” ina maana ya ISO 8601 isipokuwa ikisemwa vinginevyo. Kama mtu amekupa namba ya wiki kutoka zana ya mtindo wa Marekani (kama Excel WEEKNUM chaguo-msingi), fomula ya ubadilishaji ni tofauti — tazama sehemu ya chini.

Pia unahitaji mwaka. “Wiki 23” haina maana bila mwaka. Daima tazama namba ya wiki kama jozi (year, week). Wiki 23 ya 2025 huanza Juni 2. Wiki 23 ya 2026 huanza Juni 1. Wiki 1 ya 2026 huanza Desemba 29 ya 2025.

Fomula Kuu: Namba ya Wiki ya ISO hadi Jumatatu

Kila wiki ya ISO huanza Jumatatu. Ili kupata Jumatatu ya wiki ya ISO W katika mwaka Y:

Monday = Jan 4 of Y + (W - 1) × 7 days - weekday(Jan 4 of Y) + 1

Mantiki: Januari 4 huwa ndani ya Wiki ya 1 ya ISO kila wakati (kwa ufafanuzi — iko ndani ya siku nne za mwanzo wa mwaka, jambo linalohakikisha wiki hiyo ina Alhamisi). Tafuta Jumatatu ya wiki iliyo na Januari 4, kisha songa mbele kwa wiki (W - 1).

Njia safi iliyo sawa:

Monday of W1 = Jan 4 of Y - weekday(Jan 4 of Y) + 1
Monday of W  = Monday of W1 + (W - 1) × 7

ambapo weekday hurudisha 1 kwa Jumatatu hadi 7 kwa Jumapili (ISO weekday numbering).

Mfano: Wiki 23 ya 2026

  • Januari 4, 2026 ni Jumapili. ISO weekday = 7.
  • Jumatatu ya W1: Jan 4 − 7 + 1 = Dec 29, 2025.
  • Jumatatu ya W23: Dec 29, 2025 + 22 × 7 = Dec 29 + siku 154 = June 1, 2026.
  • Jumapili ya W23: June 1 + 6 = June 7, 2026.

Wiki 23 ya 2026 ni kuanzia Juni 1 (Jumatatu) hadi Juni 7 (Jumapili).

Mtego wa Mpaka wa Mwaka

Hili ndilo kosa la kawaida zaidi: kudhani Wiki 1 ya mwaka Y daima huanza ndani ya mwaka Y.

Sio hivyo.

Wiki 1 ya mwaka ni wiki iliyo na Alhamisi ya kwanza. Kama Alhamisi hiyo iko mapema Januari, basi Jumatatu ya Wiki 1 inaweza kuangukia Desemba ya mwaka uliotangulia.

Mifano:

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

W1 ya 2025 huanza Desemba 2024. W1 ya 2026 huanza Desemba 2025.

Hii inamaanisha:

  • Desemba 29–31, 2025 ziko ndani ya ISO Wiki 1 ya 2026, si 2025.
  • Kama mtu anasema “deliver by W1 2026,” deadline ni wiki inayoanza Desemba 29, 2025.

Mtego wa kinyume pia upo: siku za mwisho za baadhi ya miaka huangukia Wiki 1 ya mwaka unaofuata, si wiki ya mwisho ya mwaka husika. Daima tumia mwaka wa wiki wa ISO (msimbo wa muundo %G kwenye Python, isoyear kwenye PostgreSQL) unapoweka lebo — si mwaka wa kalenda.

Masafa Kamili ya Tarehe kwa Wiki Yoyote

Ukishapata Jumatatu, siku zilizobaki ni rahisi:

SikuTofauti kutoka Jumatatu
Monday+0
Tuesday+1
Wednesday+2
Thursday+3
Friday+4
Saturday+5
Sunday+6

Masafa ya tarehe ya wiki W ni: [Jumatatu, Jumatatu + siku 6].

Kwa madhumuni ya siku za kazi (Jumatatu–Ijumaa): [Jumatatu, Jumatatu + siku 4].

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 pia ina built-in kwa kinyume chake (tarehe hadi wiki ya ISO):

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

Tumia d.isocalendar().year (si d.year) unapohitaji mwaka wa ISO — vinaweza kutofautiana kwenye mipaka ya mwaka.

Kwa reverse lookup ukitumia 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

JavaScript

JavaScript haina built-in ya ISO week. Njia ya kawaida ni kuhesabu “Alhamisi” ya wiki hiyo, kisha kuhesabu wiki tangu “week 1 anchor”:

function isoWeekToMonday(year, week) {
  // Start from Jan 4, which is always in ISO week 1
  const jan4 = new Date(Date.UTC(year, 0, 4))

  // ISO weekday: Monday=1 ... Sunday=7
  const isoWeekday = (jan4.getUTCDay() + 6) % 7 + 1

  // Monday of week 1
  const week1Monday = new Date(jan4)
  week1Monday.setUTCDate(jan4.getUTCDate() - (isoWeekday - 1))

  // Monday of target week
  const monday = new Date(week1Monday)
  monday.setUTCDate(week1Monday.getUTCDate() + (week - 1) * 7)

  return monday
}

function isoWeekToRange(year, week) {
  const monday = isoWeekToMonday(year, week)
  const sunday = new Date(monday)
  sunday.setUTCDate(monday.getUTCDate() + 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

Kutumia 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 hushughulikia edge cases zote kwa usahihi na ndiyo njia inayopendekezwa kwa production code.

Excel na Google Sheets

Excel haina “week number to date” function ya moja kwa moja, lakini unaweza kuijenga kwa fomula.

Jumatatu ya ISO Wiki W katika Mwaka Y:

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

Ufafanuzi:

  • DATE(Y,1,4) — Januari 4 ya mwaka
  • WEEKDAY(DATE(Y,1,4),2) — siku ya wiki ambapo Monday=1, Sunday=7
  • Kutoa kunakupa Jumatatu ya Wiki 1
  • Kuongeza (W-1)*7 kunasonga hadi wiki lengwa

Kwa masafa kamili, Jumapili ni:

=Monday_formula + 6

Mfano kwenye sheet (A1 = year, B1 = week number):

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

Format seli zote kama tarehe. Kwa mwaka 2026, wiki 1, hii inarudisha Desemba 29, 2025 kwa Jumatatu — na hiyo ni sahihi.

Kinyume chake (tarehe hadi namba ya wiki ya ISO): Tumia ISOWEEKNUM(date). Kwa ISO year, tumia workaround kutoka makala ya ISOWEEKNUM kwa sababu Excel haina ISO year function ya asili.

SQL

PostgreSQL ina msaada kamili zaidi wa 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;

Njia safi zaidi kwa to_date na ISO format codes:

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

Hii ndiyo njia rahisi zaidi kwa PostgreSQL: tengeneza string YYYYWWD na uiparse kwa ISO format codes.

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

Namba ya Wiki ya Mtindo wa Marekani (US-style) hadi Tarehe

Kama namba ya wiki imetoka kwenye mfumo wa mtindo wa Marekani (Wiki 1 = ina Januari 1, wiki huanza Jumapili au Jumatatu), fomula ni rahisi kwa sababu hakuna mtego wa mipaka ya mwaka:

Mwanzo wa wiki (unaotegemea Jumapili):

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

ambapo WEEKDAY hurudisha 1 kwa Jumapili hadi 7 kwa Jumamosi.

Lakini namba za wiki za US si za kawaida sana kwa ratiba na lojistiki kuliko ISO. Kama mtu anakupa namba ya wiki bila kutaja mfumo, chukulia ISO — hasa katika muktadha wa biashara ya kimataifa au Ulaya.

Marejeo ya Haraka ya 2026: ISO Wiki 1–10 na 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

Kumbuka W1 ya 2026 huanza Desemba 29, 2025. Na W53 ya 2026 inaisha Januari 3, 2027 — 2026 ni mwaka wa wiki 53.

Makosa ya Kawaida kwa Muhtasari

Kutokujumuisha mwaka. “Wiki 8” ni ya utata. Daima tumia muundo 2026-W08 au unaofanana.

Kutumia mwaka wa kalenda badala ya mwaka wa wiki wa ISO. Desemba 29, 2025 iko kwenye ISO Wiki 1 ya 2026, si 2025. Kuihifadhi chini ya 2025 huweka kwenye “kikapu” kisicho sahihi.

Kudhani Wiki 1 huanza Januari 1. Mara nyingi huanza Desemba 29, 30, au 31. Kama unahitaji Januari 1 iwe Wiki 1 kila mara, unatumia mfumo wa Marekani, si ISO.

Kukosea kwa moja kwenye fomula ya Jumatatu. Anchor ya Jan 4 ni muhimu — si Jan 1 (ambayo inaweza kuwa kwenye wiki ya mwisho ya mwaka uliopita). Kutumia Jan 1 kama anchor hutoa majibu mabaya katika miaka ambayo Jan 1 iko mwishoni mwa wiki.

Kutokupima tarehe za mipaka ya mwaka. Msimbo wowote wa kushughulikia tarehe unapaswa kupimwa dhidi ya Desemba 28–31 na Januari 1–4. Hizo siku 4 hadi 7 ndizo zenye edge cases zote.

Tumia Kikokotoo cha Namba ya Wiki ya ISO kuangalia masafa ya tarehe ya wiki yoyote, au angalia namba ya wiki ya sasa pamoja na masafa ya tarehe ya wiki ya ISO ya leo.