Как да изчислите работните седмици между две дати (и защо е по-трудно, отколкото изглежда)

Имате две дати и трябва да знаете колко работни седмици има между тях. Звучи като проблем за пет секунди. Делите дните на 7, може би изваждате уикендите — готово.

Само че не е така, защото „работна седмица“ не е строго определен термин. В зависимост от това какво изчислявате — срок на предизвестие, проектен график, право на отпуск, продължителност на договор — правилният метод е различен, а грешният може да даде отклонение от дни по начин, който има юридическо или финансово значение.

Какво точно означава „работна седмица“?

Най-често „работна седмица“ означава пет дни: от понеделник до петък. Но има гранични случаи, които си струва да знаете:

  • Някои индустрии и държави използват 6‑дневна работна седмица (понеделник–събота)
  • Някои роли имат компресирана 4‑дневна работна седмица
  • В Близкия изток традиционно се използва неделя–четвъртък, макар че повечето държави преминаха към понеделник–петък
  • При непълно работно време работната седмица може да е 2, 3 или 4 дни

В останалата част на статията „работна седмица“ означава стандартна седмица понеделник–петък, освен ако не е указано друго. Методите се обобщават лесно, стига да знаете кои са работните дни във вашия случай.

Метод 1: Цели работни седмици

Най-простата интерпретация: колко пълни блокове понеделник–петък се побират между две дати?

Това е, което повечето хора имат предвид, когато питат „колко седмици предизвестие е това?“. 4‑седмично предизвестие означава 4 пълни блока понеделник–петък — 20 работни дни — независимо в кой ден от седмицата започва периодът.

Изчисление:

1. Бройте общия брой календарни дни между двете дати 2. Извадете уикендите: във всеки пълен 7‑дневен блок има 2 почивни дни 3. Отчетете частичните седмици в началото и края

На практика е по-лесно да преброите работните дни и да разделите на 5:

working_weeks = working_days / 5

където working_days е броят на дните понеделник–петък между двете дати.

Пример: 7 април (понеделник) до 2 май (петък)

  • Календарни дни: 25
  • Уикенди в периода: 4 съботи + 4 недели = 8 дни
  • Работни дни: 25 − 8 = 17... чакайте, това не е вярно.

Правилният начин: пребройте понеделник–петък включително:

  • Седмица 1: 7–11 апр (5 дни)
  • Седмица 2: 14–18 апр (5 дни)
  • Седмица 3: 21–25 апр (5 дни)
  • Седмица 4: 28 апр–2 май (5 дни)

Общо: 20 работни дни = точно 4 работни седмици.

Понеже примерът започва в понеделник и завършва в петък, резултатът излиза „чист“. Ако началото или краят са по средата на седмицата, получавате дробен резултат — което ни води до следващия метод.

Метод 2: Работни дни, разделени на 5

За повечето практични цели — планиране на проект, оценки на срокове, изчисляване на капацитет — не ви трябват цели седмици. Трябват ви работни дни, а резултатът се изразява като седмици и дни.

Формула:

total_working_days = (full_weeks × 5) + working_days_in_partial_week
weeks = floor(total_working_days / 5)
remaining_days = total_working_days mod 5

Пример: 18 март (сряда) до 11 април (петък)

Брой работни дни:

  • 18 мар (ср) до 21 мар (пет): 4 дни
  • 24–28 мар: 5 дни
  • 31 мар–4 апр: 5 дни
  • 7–11 апр: 5 дни

Общо: 19 работни дни = 3 седмици и 4 дни.

Този метод е правилен за проектни графици, където работите с капацитет в дни, а не с календарни седмици.

Метод 3: Обхват по ISO седмици

Понякога „колко седмици между“ означава: каква е разликата в ISO номерата на седмици?

Пример: Събитие тече от ISO седмица 10 до ISO седмица 23. Това е продължителност от 13 ISO седмици.

Изчисление:

week_span = (end_iso_year × 52.18) + end_iso_week − (start_iso_year × 52.18) + start_iso_week

На практика, за дати в една и съща година:

week_span = end_iso_week − start_iso_week

За периоди, които пресичат граница между години, трябва да отчетете дали началната година има 52 или 53 седмици:

week_span = (52_or_53_for_start_year − start_iso_week) + end_iso_week

Този метод е релевантен за телевизионно планиране, ритейл и всяка система, която организира работата по ISO номера на седмици, а не по работни дни.

Проблемът с включването/изключването на датите

Един от най-честите източници на грешки: дали да броите началната дата, крайната дата, и двете, или нито една.

„4‑седмично предизвестие, започващо днес“ може да означава:

  • 4 седмици от днес, като днес е ден 1 (включващо начало): периодът свършва в същия ден от седмицата, 4 седмици по-късно
  • 4 седмици след днес (изключващо начало): периодът свършва един ден по-късно от горното

Трудовото законодателство в много държави описва това изрично. В UK например срокът тече от деня след подаване на предизвестието. В САЩ зависи от договора.

Разликата е един ден. В повечето ситуации това не е критично. В трудови спорове или прекратяване на договор може да бъде.

Безопасна конвенция: винаги уточнявайте „X работни седмици от [дата], включително/изключително“. Не го оставяйте двусмислено.

Официални празници: изчислението, което всички забравят

Изчисленията на работни седмици, които не отчитат официалните празници, са по дефиниция грешни — ще надценят наличното работно време.

Проблемът: празниците не са стандартизирани. Те зависят от:

  • Държавата (Коледа е 25 декември във Великобритания; в Япония не е официален празник)
  • Регион в рамките на държава (щатите в САЩ имат различни празници; Англия и Шотландия имат различни bank holidays)
  • Годината (подвижни празници като Великден сменят дата)
  • Договора (някои позиции имат допълнителни празници; някои публични служители спазват различни дати)

За груби оценки — „това са около 6 работни седмици“ — може да игнорирате празниците. За точни изчисления — договорни срокове, предизвестия, законови времеви рамки — трябва да извадите приложимите празници.

Нито един калкулатор не може да го направи автоматично без да знае юрисдикцията ви и конкретната година. days between dates calculator показва работни дни без уикенди; местните официални празници трябва да извадите ръчно.

Полезно приближение за UK: около 8 bank holidays годишно, приблизително 1.6 на месец. За 3‑месечен период това са около 5 празника за изваждане. За федералните празници в САЩ: 11 годишно, около 0.9 на месец.

Срокове на предизвестие: как работи математиката

Трудовите договори често описват предизвестието като седмици или месеци. Преобразуването в работни дни е мястото, където най-често се греши.

„4 седмици предизвестие“ означава 4 календарни седмици (28 дни), а не 4 × 5 = 20 работни дни. Ако предизвестието е дадено във вторник, то тече 28 календарни дни — включително уикендите. Последният ден е вторник, 4 седмици по‑късно.

Това изненадва хората, защото очакват „4 седмици“ да означава 20 работни дни. Не означава — означава 28 календарни дни, и уикендите в този период пак се броят, въпреки че не се работи.

„1 месец предизвестие“ е още по‑непрецизно. Един месец от 15 януари е 15 февруари. Един месец от 31 януари е 28 февруари (или 29 в високосна година). Броят календарни дни варира между 28 и 31. Броят работни дни в този месец варира между 20 и 23.

Работни седмици vs календарни седмици в договори:

Ако договорът казва „4 работни седмици предизвестие“, това означава 20 работни дни — само понеделник–петък. Уикендите не се броят. В този случай предизвестие, започващо във вторник, ще тече 20 работни дни и ще приключи след повече календарни седмици, в зависимост от уикендите в периода.

Винаги проверявайте дали договорът казва „седмици“ или „работни седмици“. Разликата може да е 8–10 дни при типичен срок на предизвестие.

Проектни срокове: седмици усилие vs календарни седмици

В управлението на проекти „3 седмици работа“ и „3 календарни седмици“ не са едно и също.

3 седмици усилие при пълен капацитет = 15 работни дни. Ако задача изисква 3 седмици усилие от един човек на пълен работен ден, тя трае 3 календарни седмици. Ако двама я споделят, трае 1.5 календарни седмици. Ако един човек е на 50% капацитет, трае 6 календарни седмици.

3 календарни седмици = 15 работни дни, при условие че няма празници, никой не е на непълно време и няма разход за контекст‑превключване.

Това е важно за планиране на дати за доставка. Ако кажете на заинтересована страна, че функция ще отнеме „3 седмици“, а вие имате предвид работни седмици при 80% капацитет с празник по средата, крайната календарна дата ще е различна от това, което си представят.

Когато давате срокове:

  • Казвайте работни дни, не седмици, за задачи под месец
  • Посочвайте крайната календарна дата като проверка на здравия разум
  • Изрично отбелязвайте празниците в периода

Изчисляване на работни седмици в код

Python:

from datetime import date, timedelta

def working_days(start: date, end: date) -> int:
    total = 0
    current = start
    while current <= end:
        if current.weekday() < 5:  # 0=Mon, 4=Fri
            total += 1
        current += timedelta(days=1)
    return total

def working_weeks(start: date, end: date) -> float:
    return working_days(start, end) / 5

# Example
start = date(2026, 4, 7)
end = date(2026, 5, 2)
print(working_days(start, end))   # 20
print(working_weeks(start, end))  # 4.0

За големи диапазони по‑бърз подход използва модулна аритметика, за да избегне обхождане по дни:

def working_days_fast(start: date, end: date) -> int:
    days = (end - start).days + 1
    full_weeks, remainder = divmod(days, 7)
    working = full_weeks * 5
    # Count working days in the partial week
    start_dow = start.weekday()  # 0=Mon
    for i in range(remainder):
        if (start_dow + i) % 7 < 5:
            working += 1
    return working

JavaScript:

function workingDays(start, end) {
  let count = 0
  const current = new Date(start)
  while (current <= end) {
    const day = current.getDay()
    if (day !== 0 && day !== 6) count++  // 0=Sun, 6=Sat
    current.setDate(current.getDate() + 1)
  }
  return count
}

function workingWeeks(start, end) {
  return workingDays(start, end) / 5
}

SQL (PostgreSQL):

-- Working days between two dates (excluding weekends)
SELECT
  (EXTRACT(DOW FROM end_date) - EXTRACT(DOW FROM start_date))::int +
  ((end_date - start_date) / 7) * 5 +
  CASE WHEN EXTRACT(DOW FROM start_date) = 0 THEN 1 ELSE 0 END +
  CASE WHEN EXTRACT(DOW FROM end_date) = 6 THEN -1 ELSE 0 END
AS working_days
FROM (SELECT DATE '2026-04-07' AS start_date, DATE '2026-05-02' AS end_date) t;

Бърза справка

Какво ви трябваМетод
Срок на предизвестиеКалендарни дни (уикендите се броят)
Работен капацитет на проектРаботни дни (пон–пет), разделете на 5 за седмици
Планиране за медии/ритейлISO обхват по седмици
Право на отпускРаботни дни, извадете официалните празници
Договорни сроковеКалендарни дни, освен ако договорът не казва „работни дни“

days between dates calculator показва и календарните, и работните дни за всеки период — полезно като отправна точка, преди да извадите официалните празници за вашата юрисдикция.