Метод fromObject в библиотеке Luxon используется для
создания объекта DateTime на основе набора свойств. Одной
из менее очевидных, но крайне важных возможностей является работа с
недельным календарём ISO через параметры weekYear,
weekNumber и weekday.
Недельный календарь ISO отличается от привычного календаря с месяцами и днями. В нём дата определяется:
weekYear).Такой подход активно используется:
ISO-8601 определяет особую систему недель:
Из-за этого недельный год (weekYear) может отличаться от
обычного календарного года.
Пример:
| Дата | calendar year | weekYear |
|---|---|---|
| 2021-01-01 | 2021 | 2020 |
| 2022-01-01 | 2022 | 2021 |
| 2018-12-31 | 2018 | 2019 |
DateTime.fromObject({
weekYear: 2024,
weekNumber: 10,
weekday: 3
})
Здесь:
weekYear — ISO-недельный год;weekNumber — номер недели;weekday — день недели.import { DateTime } from "luxon"
Для CommonJS:
const { DateTime } = require("luxon")
const dt = DateTime.fromObject({
weekYear: 2024,
weekNumber: 1,
weekday: 1
})
console.log(dt.toISODate())
Результат:
2024-01-01
Здесь создаётся:
weekdayЗначения weekday:
| Значение | День |
|---|---|
| 1 | Понедельник |
| 2 | Вторник |
| 3 | Среда |
| 4 | Четверг |
| 5 | Пятница |
| 6 | Суббота |
| 7 | Воскресенье |
const dt = DateTime.fromObject({
weekYear: 2020,
weekNumber: 53,
weekday: 5
})
console.log(dt.toISODate())
Результат:
2021-01-01
Хотя дата находится в 2021 году, ISO-недельный год всё ещё равен 2020.
Это ключевая особенность недельного календаря.
const dt = DateTime.local(2021, 1, 1)
console.log(dt.weekYear)
console.log(dt.weekNumber)
console.log(dt.weekday)
Результат:
2020
53
5
const dt = DateTime.local(2021, 1, 1)
console.log(dt.year)
Результат:
2021
console.log(dt.weekYear)
Результат:
2020
ISO-календарь пытается сохранить полные недели.
Если начало января попадает в «хвост» предыдущей недели, дата
относится к предыдущему weekYear.
Аналогично:
const start = DateTime.fromObject({
weekYear: 2024,
weekNumber: 15,
weekday: 1
})
console.log(start.toISODate())
const end = DateTime.fromObject({
weekYear: 2024,
weekNumber: 15,
weekday: 7
})
console.log(end.toISODate())
function getWeekReportDate(weekYear, weekNumber) {
return DateTime.fromObject({
weekYear,
weekNumber,
weekday: 1
})
}
Метод fromObject поддерживает передачу временной
зоны.
const dt = DateTime.fromObject(
{
weekYear: 2024,
weekNumber: 20,
weekday: 1
},
{
zone: "Europe/Berlin"
}
)
console.log(dt.toString())
Локаль влияет на форматирование, но не меняет ISO-логику
weekYear.
const dt = DateTime.fromObject(
{
weekYear: 2024,
weekNumber: 1,
weekday: 1
},
{
locale: "ru"
}
)
console.log(dt.toLocaleString(DateTime.DATE_FULL))
Нельзя одновременно использовать:
year;month;day;вместе с:
weekYear;weekNumber;weekday.DateTime.fromObject({
year: 2024,
month: 5,
day: 10,
weekYear: 2024
})
Luxon считает такие данные конфликтующими.
DateTime.fromObject({
year: 2024,
month: 5,
day: 10
})
DateTime.fromObject({
weekYear: 2024,
weekNumber: 19,
weekday: 5
})
const dt = DateTime.fromObject({
weekYear: 2024,
weekNumber: 60,
weekday: 1
})
console.log(dt.isValid)
console.log(dt.invalidReason)
Результат:
false
unit out of range
ISO-неделя может иметь:
const weeks = DateTime.local(2020).weeksInWeekYear
console.log(weeks)
Результат:
53
function getSprintStart(weekYear, weekNumber) {
return DateTime.fromObject({
weekYear,
weekNumber,
weekday: 1
}).startOf("day")
}
function getWeekDays(weekYear, weekNumber) {
const start = DateTime.fromObject({
weekYear,
weekNumber,
weekday: 1
})
return Array.from({ length: 7 }, (_, i) =>
start.plus({ days: i })
)
}
const dt = DateTime.fromObject({
weekYear: 2025,
weekNumber: 1,
weekday: 1
})
console.log(dt.year)
console.log(dt.month)
console.log(dt.day)
const dt = DateTime.local()
console.log(dt.weekYear)
console.log(dt.weekNumber)
const dt = DateTime.local()
const reportId = `${dt.weekYear}-W${dt.weekNumber}`
console.log(reportId)
Пример результата:
2024-W18
DateTime.fromObject({
year: 2024,
month: 1,
day: 1
})
DateTime.fromObject({
weekYear: 2024,
weekNumber: 1,
weekday: 1
})
Во втором случае дата вычисляется через ISO-алгоритм недель.
const dt = DateTime.fromObject({
weekYear: 2024,
weekNumber: 10,
weekday: 3
})
console.log(dt.startOf("week").toISODate())
console.log(dt.endOf("week").toISODate())
ISO-недели особенно полезны для:
function createSprint(weekYear, weekNumber) {
const start = DateTime.fromObject({
weekYear,
weekNumber,
weekday: 1
})
const end = start.plus({ days: 13 })
return {
start: start.toISODate(),
end: end.toISODate()
}
}
const current = DateTime.now()
console.log(current.weekYear)
const dt = DateTime.local(2024, 12, 31)
console.log(dt.weekYear)
console.log(dt.weekNumber)
const dt = DateTime.local(2025, 1, 1)
console.log(dt.weekYear)
console.log(dt.weekNumber)
При использовании weekYear библиотека:
Из-за этого итоговая дата может находиться:
const dt = DateTime.local()
const updated = dt.with({
weekYear: 2025,
weekNumber: 10,
weekday: 1
})
console.log(updated.toISODate())
const dt = DateTime.fromObject({
weekYear: 2024,
weekNumber: 1,
weekday: 1
})
console.log(
dt.plus({ weeks: 1 }).toISODate()
)
console.log(
dt.minus({ weeks: 1 }).toISODate()
)
DateTime.fromObject({
weekYear: 2024,
weekNumber: 10,
weekday: 0
})
Ошибка:
unit out of range
DateTime.fromObject({
weekYear: 2021,
weekNumber: 54,
weekday: 1
})
function isValidWeek(weekYear, weekNumber) {
const maxWeeks =
DateTime.local(weekYear).weeksInWeekYear
return weekNumber >= 1 &&
weekNumber <= maxWeeks
}
const dt = DateTime.fromObject({
weekYear: 2024,
weekNumber: 20,
weekday: 2
})
console.log(dt.toISO())
console.log(dt.toJSON())
Недельные годы помогают:
weekYear особенно полезен в системах, где основной
единицей времени является неделя, а не месяц или календарная дата: