Πώς να μετατρέψετε έναν αριθμό εβδομάδας σε εύρος ημερομηνιών — Ο πλήρης οδηγός

Κάποιος σάς στέλνει ένα πρόγραμμα. "Παράδοση στο W23." Ανοίγετε το ημερολόγιό σας και το κοιτάτε. Ποιες ακριβώς ημερομηνίες είναι αυτές;

Οι αριθμοί εβδομάδων χρησιμοποιούνται παντού στον σχεδιασμό έργων, στη μεταποίηση, στο λιανικό εμπόριο και στην εφοδιαστική — αλλά οι περισσότεροι άνθρωποι τους γνωρίζουν μόνο ως ετικέτες. Η μετατροπή ενός αριθμού εβδομάδας πίσω σε πραγματικές ημερολογιακές ημερομηνίες είναι λιγότερο διαισθητική από ό,τι θα έπρεπε, και τα οριακά περιπτώσεις του έτους μπερδεύουν ακόμη και έμπειρους προγραμματιστές.

Αυτός ο οδηγός καλύπτει τη πλήρη μετατροπή: αριθμός εβδομάδας σε Δευτέρα, αριθμός εβδομάδας σε πλήρες εύρος ημερομηνιών (Δευτέρα–Κυριακή), και την αντίστροφη (ημερομηνία σε αριθμό εβδομάδας). Με κώδικα για Python, JavaScript, Excel και SQL.

Τι πραγματικά σας λέει ένας αριθμός εβδομάδας

Πριν υπολογίσετε οτιδήποτε, πρέπει να γνωρίζετε από ποιο σύστημα αρίθμησης εβδομάδων προέρχεται ο αριθμός.

ISO 8601 (το διεθνές πρότυπο): Η εβδομάδα 1 είναι η εβδομάδα που περιέχει την πρώτη Πέμπτη του έτους. Οι εβδομάδες τρέχουν από Δευτέρα έως Κυριακή. Ένα έτος έχει 52 ή 53 εβδομάδες ISO. Κρίσιμα — το έτος εβδομάδας ISO μπορεί να διαφέρει από το ημερολογιακό έτος. Οι τελευταίες ημέρες του Δεκεμβρίου βρίσκονται μερικές φορές στην Εβδομάδα 1 του επόμενου έτους.

Αμερικανικό στυλ: Η εβδομάδα 1 περιέχει την 1η Ιανουαρίου. Οι εβδομάδες μπορεί να τρέχουν από Κυριακή έως Σάββατο ή από Δευτέρα έως Κυριακή ανάλογα με το εργαλείο. Η 1η Ιανουαρίου βρίσκεται πάντα στην εβδομάδα 1, χωρίς εξαιρέσεις.

Για τον υπόλοιπο αυτόν οδηγό, "αριθμός εβδομάδας" σημαίνει ISO 8601 εκτός αν αναφέρεται διαφορετικά. Εάν κάποιος σάς έδωσε αριθμό εβδομάδας από αμερικανικό εργαλείο (όπως ο προεπιλεγμένος WEEKNUM του Excel), ο τύπος μετατροπής είναι διαφορετικός — δείτε την παρακάτω ενότητα.

Χρειάζεστε επίσης το έτος. "Εβδομάδα 23" είναι άνευ σημασίας χωρίς αυτό. Να αντιμετωπίζετε πάντα τους αριθμούς εβδομάδων ως το ζεύγος (έτος, εβδομάδα). Η εβδομάδα 23 του 2025 ξεκινά στις 2 Ιουνίου. Η εβδομάδα 23 του 2026 ξεκινά στις 1 Ιουνίου. Η εβδομάδα 1 του 2026 ξεκινά στις 29 Δεκεμβρίου του 2025.

Ο βασικός τύπος: αριθμός εβδομάδας ISO σε Δευτέρα

Κάθε εβδομάδα ISO ξεκινά τη Δευτέρα. Για να βρείτε τη Δευτέρα της εβδομάδας ISO W στο έτος Y:

Δευτέρα = 4 Ιαν Y + (W - 1) × 7 ημέρες - ημέρα_εβδομάδας(4 Ιαν Y) + 1

Η λογική: Η 4 Ιανουαρίου βρίσκεται πάντα στην εβδομάδα ISO 1 (εξ ορισμού — βρίσκεται εντός των πρώτων τεσσάρων ημερών του έτους, που εγγυάται ότι η εβδομάδα περιέχει Πέμπτη). Βρείτε τη Δευτέρα της εβδομάδας που περιέχει την 4 Ιανουαρίου, στη συνέχεια προχωρήστε (W - 1) εβδομάδες.

Ένα πιο καθαρό ισοδύναμο:

Δευτέρα W1 = 4 Ιαν Y - ημέρα_εβδομάδας(4 Ιαν Y) + 1
Δευτέρα W  = Δευτέρα W1 + (W - 1) × 7

όπου ημέρα_εβδομάδας επιστρέφει 1 για Δευτέρα έως 7 για Κυριακή (αρίθμηση ημέρας εβδομάδας ISO).

Παράδειγμα: Εβδομάδα 23 του 2026

  • 4 Ιανουαρίου 2026 είναι Κυριακή. ΗΕ ISO = 7.
  • Δευτέρα W1: 4 Ιαν − 7 + 1 = 29 Δεκ 2025.
  • Δευτέρα W23: 29 Δεκ 2025 + 22 × 7 = 29 Δεκ + 154 ημέρες = 1 Ιουν 2026.
  • Κυριακή W23: 1 Ιουν + 6 = 7 Ιουν 2026.

Η εβδομάδα 23 του 2026 τρέχει από 1 Ιουνίου (Δευτέρα) έως 7 Ιουνίου (Κυριακή).

Η παγίδα του ορίου έτους

Το πιο συνηθισμένο λάθος: να υποθέτετε ότι η Εβδομάδα 1 του έτους Y ξεκινά πάντα στο έτος Y.

Δεν ξεκινά.

Η εβδομάδα 1 ενός έτους είναι η εβδομάδα που περιέχει την πρώτη Πέμπτη. Αν αυτή η Πέμπτη είναι στις αρχές Ιανουαρίου, η Δευτέρα της Εβδομάδας 1 μπορεί να πέσει στον προηγούμενο Δεκέμβριο.

Παραδείγματα:

Εβδομάδα ISOΈτοςΔευτέραΚυριακή
W1202530 Δεκεμβρίου 20245 Ιανουαρίου 2025
W1202629 Δεκεμβρίου 20254 Ιανουαρίου 2026
W120274 Ιανουαρίου 202710 Ιανουαρίου 2027
W120283 Ιανουαρίου 20289 Ιανουαρίου 2028

Η W1 του 2025 ξεκινά τον Δεκέμβριο του 2024. Η W1 του 2026 ξεκινά τον Δεκέμβριο του 2025.

Αυτό σημαίνει:

  • 29–31 Δεκεμβρίου 2025 βρίσκονται στην εβδομάδα ISO 1 του 2026, όχι του 2025.
  • Αν κάποιος πει "παράδοση μέχρι W1 2026," η προθεσμία είναι η εβδομάδα που ξεκινά 29 Δεκεμβρίου 2025.

Υπάρχει επίσης η αντίστροφη παγίδα: οι τελευταίες ημέρες ορισμένων ετών πέφτουν στην Εβδομάδα 1 του επόμενου έτους, όχι στην τελευταία εβδομάδα του τρέχοντος έτους. Να χρησιμοποιείτε πάντα το έτος εβδομάδας ISO (τον κωδικό μορφής %G στην Python, isoyear στην PostgreSQL) όταν επισημαίνετε μια εβδομάδα — όχι το ημερολογιακό έτος.

Πλήρες εύρος ημερομηνιών για οποιοδήποτε αριθμό εβδομάδας

Μόλις έχετε τη Δευτέρα, ο υπόλοιπος της εβδομάδας είναι τετριμμένος:

ΗμέραΜετατόπιση από Δευτέρα
Δευτέρα+0
Τρίτη+1
Τετάρτη+2
Πέμπτη+3
Παρασκευή+4
Σάββατο+5
Κυριακή+6

Το εύρος ημερομηνιών για την εβδομάδα W είναι: [Δευτέρα, Δευτέρα + 6 ημέρες].

Για εργάσιμες ημέρες (Δε–Πα μόνο): [Δευτέρα, Δευτέρα + 4 ημέρες].

Python

from datetime import date, timedelta

def iso_week_to_monday(year: int, week: int) -> date:
    # Η 4 Ιαν βρίσκεται πάντα στην εβδομάδα ISO 1
    jan4 = date(year, 1, 4)
    # Επιστροφή στη Δευτέρα αυτής της εβδομάδας
    week1_monday = jan4 - timedelta(days=jan4.weekday())
    # Μεταφορά στην εβδομάδα στόχο
    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

# Παραδείγματα
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  ← σημείωση: ξεκινά το 2025
print(sunday)   # 2026-01-04

Η Python έχει επίσης ενσωματωμένο για την αντίστροφη (ημερομηνία σε εβδομάδα ISO):

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

Χρησιμοποιείτε d.isocalendar().year (όχι d.year) όταν χρειάζεστε το έτος ISO — διαφέρουν στα όρια έτους.

Για την αντίστροφη αναζήτηση χρησιμοποιώντας fromisocalendar (Python 3.8+):

# Λάβετε τη Δευτέρα της εβδομάδας ISO 23, 2026 άμεσα
monday = date.fromisocalendar(2026, 23, 1)  # ημέρα εβδομάδας 1 = Δευτέρα
print(monday)  # 2026-06-01

JavaScript

Η JavaScript δεν έχει εγγενή υποστήριξη εβδομάδας ISO. Χειροκίνητη υλοποίηση:

function isoWeekToMonday(year, week) {
  // Η 4 Ιαν βρίσκεται πάντα στην εβδομάδα ISO 1
  const jan4 = new Date(year, 0, 4)
  const dayOfWeek = jan4.getDay() || 7  // μετατροπή Κυρ=0 σε 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 }
}

// Παραδείγματα
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

Excel και Google Sheets

Το Excel δεν έχει άμεση συνάρτηση "αριθμός εβδομάδας σε ημερομηνία", αλλά μπορείτε να την κατασκευάσετε με τύπο.

Δευτέρα της εβδομάδας ISO W στο έτος Y:

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

Για πλήρες εύρος, η Κυριακή είναι απλώς:

=τύπος_Δευτέρας + 6

Παράδειγμα σε φύλλο (όπου A1 = έτος, B1 = αριθμός εβδομάδας):

Δευτέρα: =DATE(A1,1,4) - WEEKDAY(DATE(A1,1,4),2) + 1 + (B1-1)*7
Κυριακή: =κελί_Δευτέρας + 6

Αντίστροφη (ημερομηνία σε αριθμό εβδομάδας ISO): Χρησιμοποιείτε ISOWEEKNUM(ημερομηνία).

SQL

PostgreSQL έχει την πιο πλήρη υποστήριξη ISO:

-- Δευτέρα εβδομάδας ISO W στο έτος Y
SELECT
  make_date(2026, 1, 4)
    + (23 - 1) * 7  -- βήμα στην εβδομάδα 23
    - EXTRACT(isodow FROM make_date(2026, 1, 4))::int + 1
    AS week_monday;
-- 2026-06-01

-- Καθαρότερη προσέγγιση χρησιμοποιώντας to_date με κωδικούς μορφής ISO
SELECT to_date('2026' || '23' || '1', 'IYYYIWid') AS monday;
-- 2026-06-01

Εβδομάδες αμερικανικού στυλ σε ημερομηνίες

Αν ο αριθμός εβδομάδας προήλθε από αμερικανικό σύστημα (Εβδομάδα 1 = περιέχει 1η Ιανουαρίου), ο τύπος είναι απλούστερος γιατί δεν υπάρχει πρόβλημα ορίου έτους. Αλλά οι αριθμοί αμερικανικής εβδομάδας είναι πολύ λιγότερο συνηθισμένοι στον προγραμματισμό και τη εφοδιαστική από ό,τι το ISO. Αν κάποιος σάς δίνει αριθμό εβδομάδας χωρίς να καθορίζει το σύστημα, υποθέστε ISO — ειδικά σε διεθνή ή ευρωπαϊκά επιχειρηματικά πλαίσια.

Σύνοψη συνηθισμένων λαθών

Χωρίς συμπερίληψη του έτους. "Εβδομάδα 8" είναι αμφίσημη. Να χρησιμοποιείτε πάντα τη μορφή 2026-W08 ή ισοδύναμο.

Χρήση ημερολογιακού έτους αντί ISO έτους εβδομάδας. Η 29 Δεκεμβρίου 2025 βρίσκεται στην εβδομάδα ISO 1 του 2026, όχι του 2025.

Υπόθεση ότι η Εβδομάδα 1 ξεκινά 1η Ιανουαρίου. Ξεκινά 29, 30 ή 31 Δεκεμβρίου σε πολλά έτη.

Σφάλμα κατά ένα στον τύπο Δευτέρας. Η άγκυρα 4 Ιαν είναι σημαντική — όχι η 1η Ιαν (που μπορεί να βρίσκεται στην τελευταία εβδομάδα του προηγούμενου έτους).

Χωρίς δοκιμή ημερομηνιών ορίου έτους. Οποιοσδήποτε κώδικας διαχείρισης ημερομηνιών πρέπει να δοκιμαστεί με 28–31 Δεκεμβρίου και 1–4 Ιανουαρίου.

Χρησιμοποιείτε τον Υπολογιστή αριθμών εβδομάδων ISO για να αναζητήσετε το εύρος ημερομηνιών για οποιονδήποτε αριθμό εβδομάδας, ή ελέγξτε τον τρέχοντα αριθμό εβδομάδας και το σημερινό εύρος ημερομηνιών εβδομάδας ISO.

Σχετικά άρθρα