Вычитание дат в Javascript
Всем доброго времени суток!
Я новичок в Javascript, знаю самый минимум возможностей, а передо мной появилась такая задача: Есть три тега списка select: День, Месяц, Год Есть также три тега списка select для другой даты в том же формате. Задача: вычесть одну дату из другой, т.е. получить разницу в днях (но не миллисекундах, часах и т.д.) На данный момент получается почему-то, что даже если даты указаны одинаковые, возвращается большое значение в миллисекундах. И работает ли вычитание я понять пока не могу :( Подскажите, пожалуйста, как реализовать такой функционал? В интернете копался, откуда и почерпнул аналогию решения задачи, но принцип здесь по-видимому в нюансах работы с методом Date(). Подскажите, пожалуйста, как с использованием значений даты из формы провести вычитание дат и получить результат в виде количества дней? Ниже представлю свой код, который есть на данный момент. Всем заранее спасибо за участие и внимание! function daysCalc() { var dayStart = parseInt(jQuery("#day").val(), 10); var monthStart = parseInt(jQuery("#month").val()); var yearStart = parseInt(jQuery("#year").val()); var dateStart = new Date(yearStart, monthStart, dayStart); var dayEnd = parseInt(jQuery("#day-end").val()); var monthEnd = parseInt(jQuery("#month-end").val()); var yearEnd = parseInt(jQuery("#year-end").val()); var dateEnd = new Date(yearEnd, monthEnd, dayEnd); var subtract = (dateEnd - dayStart); alert(subtract); } |
Искренне прошу прощения за дубликат темы.
Отключился интернет, авторизацию пришлось пройти заново и темы создались две. |
пример вычисления количества дней до нового года:
var date1 = new Date(); var date2 = new Date("1/1/2015"); var diff = date2 - date1; var milliseconds = diff; var seconds = milliseconds / 1000; var minutes = seconds / 60; var hours = minutes / 60; var days = hours / 24; alert(days); alert(Math.ceil(days)); |
melky,
Спасибо большое! Ваш вариант работает. Но появился дополнительный вопрос: Почему-то если выбирать дату начала например такую: 29.12.2014 и дату окончания 3.1.2015 результатом является число -26 (если не использовать предложенную Вами функцию alert(Math.ceil(days));) А с использованием в результате получается 0. Возможно, что это имеет значение, но параллельно с этим скриптом у меня работает скрипт автоматической подстановки текущей даты. Если необходимо - могу отправить! Спасибо большое за участие! |
Цитата:
убрать такое поведение можно модулем на разнице двух дат: // было var diff = date2 - date1; // стало var diff = Math.abs(date2 - date1); |
melky,
Спасибо огромное! Все заработало! |
kover-samolet,
потому что в начале месяц потом день потом год var date1 = new Date("12/29/2014"); var date2 = new Date("1/3/2015"); var diff = date2 - date1; var milliseconds = diff; var seconds = milliseconds / 1000; var minutes = seconds / 60; var hours = minutes / 60; var days = hours / 24; alert(days); alert(Math.ceil(days)); |
нашёл скрипт
<script type="text/javascript"><!-- var d = new Date(); var month=new Array("января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"); document.write(d.getDate()+ " " + month[d.getMonth()] + " " + d.getFullYear() ); // --></script> как из текущей даты отнять день ,куда надо вставить - 24*60*60*1000 |
var d = new Date( new Date()-24*60*60 ); |
Цитата:
|
Цитата:
Да, ошибка. Конструктор принимает не миллисекунды, а секунды. |
я незнаю где и что принимает, но выдало 25 февраля без миллисекунд, и 24 февраля с милисекундами...
|
Rise, понедельник - день тяжелый :)
Конструктор класса Date принимает миллисекунды. Метод getMilliseconds возвращает миллисекунды (0-999) указанной даты по местному времени. Для явного приведения к int нужно использовать методе getTime, который возвращает количеством миллисекунд, прошедших с 1 января 1970 года 00:00:00 по UTC В итоге должно было получиться так: var d = new Date( new Date().getTime()-24*60*60*1000 ); рони, Rise, спасибо, что указали на ошибку) |
кто поможет доработать скрипт?
имеется скрипт который выводит сегодняшнюю дату и вторую дату на 13 дней меньше, надо сделать чтобы у второй даты отнималось разное количество дней в разные периоды времени, согласно таблице <script> var d = new Date(); var day=new Array("Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"); var month=new Array("января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"); document.write(day[d.getDay()]+"<br/>" +d.getDate()+ " " + month[d.getMonth()]+ " " + d.getFullYear()); document.write("<br>"); d.setDate(d.getDate() - 13); document.write(d.getDate()+ " " + month[d.getMonth()] + " " + d.getFullYear()) </script> <br/><br/><br/><br/><br/> <table border="1"> <tr><td>Кол-во дней</td><td>период чч.мм.гггг – чч.мм.гггг</td></tr><tr><td>10</td><td>15.10.1582 — 11.03.1700</td></tr> <tr><td>11</td><td>12.03.1700 — 12.03.1800</td></tr> <tr><td>12</td><td>13.03.1800 — 13.03.1900</td></tr> <tr><td>13</td><td>14.03.1900 — 14.03.2100</td></tr> <tr><td>14</td><td>15.03.2100 — 15.03.2200</td></tr><tr><td>15</td><td>16.03.2200 — 16.03.2300</td></tr></table> |
Хм...
|
Внимание опрос ! ! ! почему мой предыдущий вопрос остался без ответа? 1.) Вопрос понятен, но не знаю решения... 2.) Вопрос сформулирован некорректно, поэтому непонятен... 3.) ты уже всех достал... 4.)Предложите свой вариант ответа |
Rize, но во вторую строку можно поставить нужную дату
var d = new date ( сюда ); или и нет? |
Цитата:
|
P. S. григорианский календарь впервые введён папой римским Григорием VIII 15.10.1582 г. поэтому введённая дата не корректна, с таким приблизительно текстом у span'а меняется стиль с display: none; на display: block;
|
зачем переводить дату до 1582г по юлианскому календарю в григорианский, если григорианского в то время не существовало, даже в википедии сказано что это не корректно... просто показываем спан и нафига лишняя морока с какими то другими (пролептическими) календарями, не было до этого григорианского и точка(эррор). другими словами словами пусть в пролептическом хоть девять с сотыми долями, это нас не волнует, поскольку находится за рамками поставленной задачи, цель ограничивается только указанным периодом, см таблицу первая и последняя строки.
весь скрипт поместится в 10-15строк, и займёт 5 мин времени... |
обыкновенно, через элементы select и input, только результат расчёта в григорианском див'е в ввиде <option value="0" selected></option> и <input value=""> то есть пустые значения,
прочитав в вики о некоректности пересчёта юлианских дат в григорианский, я начал рассуждать как бы выделить результат рассчётов в этом случае, типа реализовать изменение цвета селекта и инпута на красный и тому подобное, пока не возник в голове вопрос, а зачем вообще переводить с юлианского в григорианский подобные даты и понял что это лишнее, надо просто оставить юлианскую дату в григорианском вывести пустые значения а под юлианской вывести спан с инфой что григорианский календарь появился после введённой даты. |
как к примеру можно перевести дату в марсианский календарь, если наука считает что на Марсе жизни нет, следовательно и марсианского календаря не существует в природе, и главный вопрос вопрос зачем переводить в марсианский?
|
Rise, надо просто сделать три вещи, 1. что бы вычиталось не 13 дней всегда, а согласно таблице, 2 заменить текст на селекты и инпуты 3.чтобы сегодняшняя дата во второй строке заменялась на введенную посетителем
|
пролептическая система это расширение григорианской, что не значит что григорианская =пролептической, григорианскопролептическа я выходит за рамки, цель ограничится только григорианским периодом.
|
Rize я пытаюсь объяснить очевидное, 14.10.1582 эта дата есть в григорианско-пролептическом исчеслении, но этой даты нет в чисто григорианском исчеслении, поскольку только 15.10 была введена григорианская система
|
Часовой пояс GMT +3, время: 21:55. |