Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вычитание дат в Javascript (https://javascript.ru/forum/misc/52664-vychitanie-dat-v-javascript.html)

kover-samolet 29.12.2014 21:57

Вычитание дат в 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);
			}

kover-samolet 29.12.2014 21:58

Искренне прошу прощения за дубликат темы.
Отключился интернет, авторизацию пришлось пройти заново и темы создались две.

melky 29.12.2014 22:14

пример вычисления количества дней до нового года:
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));

kover-samolet 29.12.2014 23:08

melky,
Спасибо большое!
Ваш вариант работает.
Но появился дополнительный вопрос:
Почему-то если выбирать дату начала например такую: 29.12.2014
и дату окончания 3.1.2015 результатом является число -26 (если не использовать предложенную Вами функцию
alert(Math.ceil(days));
)
А с использованием в результате получается 0.

Возможно, что это имеет значение, но параллельно с этим скриптом у меня работает скрипт автоматической подстановки текущей даты.
Если необходимо - могу отправить!

Спасибо большое за участие!

melky 29.12.2014 23:49

Цитата:

Сообщение от kover-samolet (Сообщение 348867)
melky,
Спасибо большое!
Ваш вариант работает.
Но появился дополнительный вопрос:
Почему-то если выбирать дату начала например такую: 29.12.2014
и дату окончания 3.1.2015 результатом является число -26 (если не использовать предложенную Вами функцию
alert(Math.ceil(days));
)
А с использованием в результате получается 0.

Возможно, что это имеет значение, но параллельно с этим скриптом у меня работает скрипт автоматической подстановки текущей даты.
Если необходимо - могу отправить!

Спасибо большое за участие!

угумс, может быть такое. это значит, местами перепутали две даты - из "новой" вычитаете "старую".

убрать такое поведение можно модулем на разнице двух дат:
// было
var diff = date2 - date1;
// стало
var diff = Math.abs(date2 - date1);

kover-samolet 30.12.2014 00:04

melky,
Спасибо огромное! Все заработало!

рони 30.12.2014 00:08

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

Besprizornik 25.02.2019 09:37

нашёл скрипт
<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

Nexus 25.02.2019 09:42

var d = new Date(
    new Date()-24*60*60
);

рони 25.02.2019 09:47

Цитата:

Сообщение от Nexus
.getMilliseconds()

:-? лишнее!!!

Nexus 25.02.2019 09:53

Цитата:

Сообщение от рони
лишнее

Просто явное приведение к int
Да, ошибка. Конструктор принимает не миллисекунды, а секунды.

Besprizornik 25.02.2019 11:00

я незнаю где и что принимает, но выдало 25 февраля без миллисекунд, и 24 февраля с милисекундами...

Nexus 25.02.2019 12:00

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, спасибо, что указали на ошибку)

Besprizornik 26.02.2019 13:54

кто поможет доработать скрипт?
имеется скрипт который выводит сегодняшнюю дату и вторую дату на 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>

Besprizornik 26.02.2019 21:37

Хм...

Besprizornik 26.02.2019 23:03

Внимание опрос ! ! !
почему мой предыдущий вопрос остался без ответа?

1.) Вопрос понятен, но не знаю решения...

2.) Вопрос сформулирован некорректно, поэтому непонятен...

3.) ты уже всех достал...

4.)Предложите свой вариант ответа

Besprizornik 27.02.2019 00:35

Rize, но во вторую строку можно поставить нужную дату
var d = new date ( сюда ); или и нет?

Besprizornik 27.02.2019 00:43

Цитата:

Сообщение от Rise (Сообщение 504138)
Besprizornik, а до 15.10.1582 какая разница?

разница 0 потому что Григорий VIII еще не подписал указ о принятии нового календаря названного в его честь...

Besprizornik 27.02.2019 01:30

P. S. григорианский календарь впервые введён папой римским Григорием VIII 15.10.1582 г. поэтому введённая дата не корректна, с таким приблизительно текстом у span'а меняется стиль с display: none; на display: block;

Besprizornik 27.02.2019 03:19

зачем переводить дату до 1582г по юлианскому календарю в григорианский, если григорианского в то время не существовало, даже в википедии сказано что это не корректно... просто показываем спан и нафига лишняя морока с какими то другими (пролептическими) календарями, не было до этого григорианского и точка(эррор). другими словами словами пусть в пролептическом хоть девять с сотыми долями, это нас не волнует, поскольку находится за рамками поставленной задачи, цель ограничивается только указанным периодом, см таблицу первая и последняя строки.
весь скрипт поместится в 10-15строк, и займёт 5 мин времени...

Besprizornik 27.02.2019 06:21

обыкновенно, через элементы select и input, только результат расчёта в григорианском див'е в ввиде <option value="0" selected></option> и <input value=""> то есть пустые значения,

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

Besprizornik 27.02.2019 06:29

как к примеру можно перевести дату в марсианский календарь, если наука считает что на Марсе жизни нет, следовательно и марсианского календаря не существует в природе, и главный вопрос вопрос зачем переводить в марсианский?

Besprizornik 27.02.2019 20:31

Rise, надо просто сделать три вещи, 1. что бы вычиталось не 13 дней всегда, а согласно таблице, 2 заменить текст на селекты и инпуты 3.чтобы сегодняшняя дата во второй строке заменялась на введенную посетителем

Besprizornik 27.02.2019 20:44

пролептическая система это расширение григорианской, что не значит что григорианская =пролептической, григорианскопролептическа я выходит за рамки, цель ограничится только григорианским периодом.

Besprizornik 27.02.2019 23:16

Rize я пытаюсь объяснить очевидное, 14.10.1582 эта дата есть в григорианско-пролептическом исчеслении, но этой даты нет в чисто григорианском исчеслении, поскольку только 15.10 была введена григорианская система


Часовой пояс GMT +3, время: 21:55.