Как добавить часы к объекту Date?
Удивительно, что объект Date в JavaScript не реализует функцию добавления времени.
Я просто хочу создать функцию, которая будет делать следующее:
var now = Date.now();
var fourHoursLater = now.addHours(4);
function Date.prototype.addHours(h) {
// Как мне это реализовать?
}
Мне нужны некоторые подсказки в правильном направлении.
- Нужно ли мне заниматься разбором строки?
- Могу ли я использовать
setTime
? - Как насчет миллисекунд?
Что-то вроде этого:
new Date(milliseconds + 4 * 3600 * 1000 /* 4 часа в мс */);
Хотя это кажется довольно "хакерским" решением - так ли это вообще работает?
5 ответ(ов)
JavaScript сам по себе имеет довольно плохие API для работы с датой и временем. Тем не менее, вы можете сделать это на чистом JavaScript:
Date.prototype.addHours = function(h) {
this.setTime(this.getTime() + (h * 60 * 60 * 1000));
return this;
}
Этот код добавляет заданное количество часов к объекту даты. Вы просто добавляете количество часов, умноженное на количество миллисекунд в часе (60 минут * 60 секунд * 1000 миллисекунд), к текущему времени. После этого функция возвращает обновленный объект даты.
Вы можете добавить метод addHours
к объекту Date
в JavaScript, чтобы изменять время на заданное количество часов. Вот пример такого метода:
Date.prototype.addHours = function(h) {
this.setHours(this.getHours() + h);
return this;
}
Этот метод принимает количество часов h
и добавляет их к текущему времени объекта Date
. После выполнения метода возвращается обновленный объект.
Вот пример теста, который демонстрирует, как это использовать:
alert(new Date().addHours(4));
В этом примере создается новый объект даты с текущим временем и к нему добавляется 4 часа. Затем результат отображается в виде предупреждения.
Пожалуйста, помните, что изменение прототипа встроенных объектов, таких как Date
, может привести к конфликтам и непредсказуемому поведению в вашем коде или в сторонних библиотеках. Лучше использовать этот подход с осторожностью или рассмотреть возможность создания вспомогательных функций для подобной функциональности.
Чтобы получить дату ровно через два часа от текущего момента в одну строку, вы можете использовать следующий код:
let expiryDate = new Date(Date.now() + 2 * 60 * 60 * 1000);
Пример использования:
let nowDate = new Date();
let expiryDate = new Date(Date.now() + 2 * 60 * 60 * 1000);
console.log('now', nowDate);
console.log('expiry', expiryDate);
В этом примере expiryDate
будет содержать дату и время, которое наступит через два часа после текущего момента.
Лучше сделать метод addHours
неизменяемым, возвращая копию объекта Date, а не мутируя его параметр. Это позволит избежать непредвиденных изменений состояния при последовательных вызовах методов.
Вот как можно реализовать этот подход:
Date.prototype.addHours = function(h) {
var copiedDate = new Date(this.getTime());
copiedDate.setHours(copiedDate.getHours() + h);
return copiedDate;
}
Таким образом, вы сможете использовать цепочку вызовов методов, не беспокоясь о изменении состояния оригинального объекта.
Если вы хотите сделать это более функционально (не изменяя исходные данные), я бы рекомендовал возвращать новый объект даты вместо изменения существующего, и не изменять прототип, а создать отдельную функцию. Вот пример:
// JS
function addHoursToDate(date, hours) {
return new Date(new Date(date).setHours(date.getHours() + hours));
}
// TS
function addHoursToDate(date: Date, hours: number): Date {
return new Date(new Date(date).setHours(date.getHours() + hours));
}
let myDate = new Date();
console.log(myDate);
console.log(addHoursToDate(myDate, 2));
Таким образом, ваше исходное значение даты останется неизменным, и вы получите новый объект даты с добавленными часами. Это соответствует принципам функционального программирования и обеспечивает более предсказуемое поведение.
Сравнение двух дат в JavaScript
Как отсортировать массив объектов по свойству даты?
В чем разница между String.slice и String.substring?
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"