В библиотеке Luxon метод negate относится к работе с
объектами типа Duration и предназначен для инвертирования
знака длительности. Он возвращает новую длительность, в которой все
временные компоненты изменены на противоположные по знаку значения.
Длительность в Luxon представляет собой структурированное значение времени, включающее годы, месяцы, дни, часы, минуты, секунды и миллисекунды. Внутренне такие значения могут быть как положительными, так и отрицательными.
Метод negate выполняет математическую операцию умножения
всех полей длительности на -1, сохраняя структуру
объекта:
При этом создаётся новый экземпляр Duration, исходный
объект остаётся неизменным.
Duration#negate(): Duration
Метод не принимает аргументов и возвращает новый объект
Duration.
При вызове negate происходит построчное преобразование
всех внутренних полей длительности:
yearsmonthsdayshoursminutessecondsmillisecondsКаждое значение инвертируется по знаку, при этом структура объекта и его конфигурация сохраняются.
import { Duration } from "luxon";
const d1 = Duration.fromObject({
hours: 5,
minutes: 30
});
const d2 = d1.negate();
console.log(d2.toObject());
// { hours: -5, minutes: -30 }
Исходный объект d1 остаётся неизменным, что
соответствует принципу иммутабельности Luxon.
Если исходная длительность уже отрицательная, negate
преобразует её в положительную форму:
const d1 = Duration.fromObject({
minutes: -15
});
const d2 = d1.negate();
console.log(d2.toObject());
// { minutes: 15 }
Таким образом, метод работает как универсальный переключатель знака.
Luxon хранит длительность в виде нормализованной структуры, но при
выполнении negate нормализация не изменяет смысл операции.
Метод не пересчитывает значения между единицами измерения, а только
инвертирует каждое поле отдельно.
Пример:
const d = Duration.fromObject({
hours: 1,
minutes: 120
});
const neg = d.negate();
console.log(neg.toObject());
// { hours: -1, minutes: -120 }
Здесь не происходит преобразования 120 минут в 2 часа, поскольку
negate работает на уровне уже заданных полей.
Метод negate не изменяет исходный объект, а возвращает
новый, что позволяет безопасно использовать цепочки методов:
const result = Duration.fromObject({
days: 3,
hours: 4
})
.negate()
.shiftTo("hours");
console.log(result.toObject());
// результат будет выражен в отрицательных часах
Каждый вызов создаёт новый объект, сохраняя предсказуемость вычислений.
Метод negate часто применяется в сочетании с операциями
сложения и вычитания длительностей. В Luxon отсутствует прямой оператор
вычитания между Duration, поэтому отрицательная форма
используется как инструмент моделирования разности:
const a = Duration.fromObject({ hours: 10 });
const b = Duration.fromObject({ hours: 3 });
const diff = a.plus(b.negate());
console.log(diff.toObject());
// { hours: 7 }
Такая конструкция эквивалентна вычитанию, реализованному через сложение отрицательной длительности.
При использовании negate важно учитывать, что Luxon не
изменяет структуру единиц. Если длительность содержит смешанные
значения, например:
const d = Duration.fromObject({
hours: 1,
minutes: 90
});
После инверсии:
d.negate().toObject();
// { hours: -1, minutes: -90 }
Нормализация (например, преобразование 90 минут в 1 час 30 минут)
выполняется отдельно через методы вроде normalize, но
negate на это не влияет.
Нулевые компоненты остаются неизменными:
const d = Duration.fromObject({
hours: 0,
minutes: 45
});
const neg = d.negate();
console.log(neg.toObject());
// { hours: 0, minutes: -45 }
Ноль рассматривается как нейтральный элемент и не изменяет знак.
Метод negate используется в логике, где требуется:
Особенно часто он встречается в алгоритмах планирования и расчётах временных отклонений.
negate логически связан с методами:
plusminusasshiftTonormalizeВ комбинации они позволяют выполнять полные преобразования временных
интервалов, где negate выступает как операция смены знака
перед дальнейшими вычислениями.