Вычитание дат в 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, время: 09:21. |