6

Как добавить часы к объекту Date?

6

Удивительно, что объект 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 ответ(ов)

6

JavaScript сам по себе имеет довольно плохие API для работы с датой и временем. Тем не менее, вы можете сделать это на чистом JavaScript:

Date.prototype.addHours = function(h) {
  this.setTime(this.getTime() + (h * 60 * 60 * 1000));
  return this;
}

Этот код добавляет заданное количество часов к объекту даты. Вы просто добавляете количество часов, умноженное на количество миллисекунд в часе (60 минут * 60 секунд * 1000 миллисекунд), к текущему времени. После этого функция возвращает обновленный объект даты.

4

Вы можете добавить метод addHours к объекту Date в JavaScript, чтобы изменять время на заданное количество часов. Вот пример такого метода:

Date.prototype.addHours = function(h) {
    this.setHours(this.getHours() + h);
    return this;
}

Этот метод принимает количество часов h и добавляет их к текущему времени объекта Date. После выполнения метода возвращается обновленный объект.

Вот пример теста, который демонстрирует, как это использовать:

alert(new Date().addHours(4));

В этом примере создается новый объект даты с текущим временем и к нему добавляется 4 часа. Затем результат отображается в виде предупреждения.

Пожалуйста, помните, что изменение прототипа встроенных объектов, таких как Date, может привести к конфликтам и непредсказуемому поведению в вашем коде или в сторонних библиотеках. Лучше использовать этот подход с осторожностью или рассмотреть возможность создания вспомогательных функций для подобной функциональности.

0

Чтобы получить дату ровно через два часа от текущего момента в одну строку, вы можете использовать следующий код:

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 будет содержать дату и время, которое наступит через два часа после текущего момента.

0

Лучше сделать метод addHours неизменяемым, возвращая копию объекта Date, а не мутируя его параметр. Это позволит избежать непредвиденных изменений состояния при последовательных вызовах методов.

Вот как можно реализовать этот подход:

Date.prototype.addHours = function(h) {
    var copiedDate = new Date(this.getTime());
    copiedDate.setHours(copiedDate.getHours() + h);
    return copiedDate;
}

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

0

Если вы хотите сделать это более функционально (не изменяя исходные данные), я бы рекомендовал возвращать новый объект даты вместо изменения существующего, и не изменять прототип, а создать отдельную функцию. Вот пример:

// 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));

Таким образом, ваше исходное значение даты останется неизменным, и вы получите новый объект даты с добавленными часами. Это соответствует принципам функционального программирования и обеспечивает более предсказуемое поведение.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь