Я хотел бы получить объект Date, который на 30 минут позже, чем другой объект Date. Как мне сделать это с помощью JavaScript?
javascript
date
date-manipulation
Морган Ченг
источник
источник
date.setMinutes(date.getMinutes() + ...)
, не будут пересекать границы перехода на летнее время. Например (при условии, что '2014-03-09' является границей перехода на летнее время):var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30);
d
сейчас на 30 минут раньше, а не позжеf
.f
иd
вы увидите, что один говорит «GMT-0500», другой говорит «GMT-0400» (или любой другой часовой пояс). Кроме того, если вы вызовете.getTime()
обаf
иd
, вы увидите, чтоf
это больше, чемd
(то есть позже).01:89
станет02:29
, чего не существует в тот день, когда вы «прыгаете вперед». Хром решает, что должно быть01:29
, FF решает03:29
. В ту ночь, когда вы «откатываетесь», оба браузера пропускают «откат» и переходят на 90 минут вперед02:29
. Вот некоторые демонстрации JSFiddle: «весна вперед» / «падение назад»Ответы:
Использование библиотеки
Если вы выполняете много работы с датами, вы можете посмотреть библиотеки дат JavaScript, такие как Datejs или Moment.js . Например, с Moment.js это просто:
Ванильный Javascript
Это как ответ хаоса , но в одной строке:
Где
diff
разница в минутах вы хотите отoldDateObj
времени. Это может быть даже отрицательным.Или как функция многократного использования, если вам нужно сделать это в нескольких местах:
И на случай, если это не очевидно, причина, по которой мы умножаем минуты,
60000
заключается в том, чтобы преобразовать минуты в миллисекунды.Будьте осторожны с ванильным Javascript. Даты трудны!
Вы можете подумать, что можете добавить 24 часа к дате, чтобы получить завтрашнюю дату, верно? Неправильно!
Оказывается, если пользователь соблюдает переход на летнее время, день не обязательно должен длиться 24 часа. Один день в году длится всего 23 часа, а один день в году - 25 часов. Например, в большинстве Соединенных Штатов и Канады 24 часа после полуночи, 2 ноября 2014 года, по-прежнему 2 ноября:
Вот почему использование одной из вышеупомянутых библиотек безопаснее, если вам придется много работать с этим.
Ниже приведена более общая версия этой функции, которую я написал. Я бы по-прежнему рекомендовал использовать библиотеку, но это может быть излишним / невозможным для вашего проекта. Синтаксис смоделирован после функции MySQL DATE_ADD .
Рабочая демоверсия jsFiddle .
источник
источник
Date
объекта.var d = new Date(); d.setMinutes(d.getMinutes() + 30);
источник
setTime
возвращается числовая метка времени в миллисекундах, а не объект даты. (Не думаю, что вы можете сделать одну строчку.)var in30Mins = new Date(+new Date() + 1.8e6)
однострочный, но не уверен, что он лучше двухслойного. ;-)источник
setMinutes
возвращаетnow
Date
now = new Date(now)
Может как то так?
источник
Date
объекта.var d = new Date(); d.setMinutes(d.getMinutes() + 30);
If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
Я всегда создаю 7 функций для работы с датой в JS: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.
Вы можете увидеть пример здесь: http://jsfiddle.net/tiagoajacobi/YHA8x/
Как пользоваться:
Это функции:
источник
date.addHours(3, 30)
добавить 3 часа и 30 минут. Для addYears потребуются годы, месяцы и дни, для addMonth - месяцы и дни, для addMinutes - минуты, секунды, миллисекунды и т. д.new Date().addHours(4).addMinutes(45);
Вы можете вызывать столько, сколько хотите, потому что методы возвращают «this», который является текущим объектом Date.var dt = new Date();
тогдаdt.addMinutes(45); dt.addHours(4);
или даже,dt.addMinutes(285);
илиdt.addMinutes(45).addHours(4);
все будет работать. Если у вас есть вопрос с примером кода, для вашей проблемы опубликуйте его здесь, я буду рад вам помочь.Самый простой способ решить эту проблему - распознать, что в javascript даты - это просто числа. Это начинается
0
или'Wed Dec 31 1969 18:00:00 GMT-0600 (CST)
. Каждый1
представляет миллисекунду. Вы можете добавлять или вычитать миллисекунды, получая значение и создавая новую дату, используя это значение. С этим умом вы можете справиться довольно легко.источник
Это то, что я делаю, что, кажется, работает довольно хорошо:
Тогда вы можете просто назвать это так:
источник
return new Date(this.getTime() + minutes * 60000);
, я временная копия не нужна. ;-)Вот версия ES6 :
Назовите это как:
источник
Я чувствую, что во многих ответах здесь отсутствует креативная составляющая, очень необходимая для расчетов путешествий во времени. Я представляю свое решение для временного перевода 30 минут.
(jsfiddle здесь )
источник
Для ленивых, как я:
Ответ Кипа (сверху) в coffeescript, использующий enum и работающий над тем же объектом:
источник
Использовать известную библиотеку для обработки причуд, связанных с расчетами времени. Мой текущий фаворит - moment.js .
источник
Просто еще один вариант, о котором я написал:
Библиотека DP_DateExtensions
Это излишне, если вам нужна вся обработка дат, но она будет делать то, что вы хотите.
Поддерживает форматирование даты / времени, математику даты (сложение / вычитание частей даты), сравнение даты, разбор даты и т. Д. Это свободно открытый источник.
источник
Вы могли бы сделать это:
источник
Вот мой однострочник:
источник
Вы должны получить значение текущей даты, чтобы получить дату с (мс) и добавить к ней (30 * 60 * 1000). Теперь у вас есть (текущая дата + 30 минут) с мс
источник
Я знаю, что тема слишком старая. Но я почти уверен, что некоторые разработчики все еще нуждаются в этом, поэтому я сделал этот простой сценарий для вас. Я надеюсь, вам понравится это!
источник