Jump to content
  • 0

расчёт, через сколько лет наступит дата


iillyyaa2
 Share

Question

есть текущая дата, которую мы получаем как new Date()

есть дата, которую вводит юзерь, год, месяц, день

нужно вывести юзеру через сколько лет, месяцев и дней наступит данная дата

высчитывать кол-во секунд разницы а потом делить на (365*12*30*24*60*60) что бы получить года, не верно

т.к. в данном расчёте не учтёны 29 февраля, да и месяцы бывают разной длинны

сделал расчёт:


d1 = d1.getTime() - d0.getTime();
d1 = new Date(0, 0, 0, 0, 0, 0, d1);

тоесть высчитал разницу микросекунд

а потом узнал дату на это время, но это косяк.

дата там

Sun Dec 31 00:00:00 UTC+0300 1899

может есть какой то вариант, как расчитать сколько же лет, месяцев, дней пройдёт до требуемой даты ?

тоесть:

сегодня 5 декабря 2011

хочу знать, что 17 января 2111 года

наступит через 12 дней, 1 месяц, 99 лет

так же хотелось бы высчитать, через сколько дней наступит данная дата (к примеру через 36500 дней)

и через сколько месяцев и дней (к приперу через 1200 месяцев и 12 дней)

после всех попыток высчитать это, осталось последнее решение, это прописать все месяцы (сколько в них дней) и високосный год, а дальше отсчитывать его в плюс или минус по 4 года.

Link to comment
Share on other sites

24 answers to this question

Recommended Posts

  • 0

Берем 27-е февраля 2012 и 1е марта 2013.

Между ними один год (365) и два дня (28.02.2013 + 29.02.2013)

Между 27-м февраля 2011 и 1-м марта 2012: год и два дня (28.02.2012 + 29.02.2012)

Между 27.02.2010 и 01.03.2011: год и день

Между 27.02.2010 и 1.03.2013: три года и два дня. Или один день?

Link to comment
Share on other sites

  • 0

я почти доделал движок, несколько моментов осталось... мелочь...


tDate = {0:31,1:28,2:31,3:30,4:31,5:30,6:31,7:31,8:30,9:31,10:30,11:31,'vis':2012};

и куча кода на обработку разницы в месяцах и годах, подсчёт високосных годов...

вроде мелочь, а пришлось писать кучу кода..

Link to comment
Share on other sites

  • 0

А я уже всё посчитал за вас :rolleyes:

И, кстати! Там ещё внизу на странице есть закомментированный код, вот если его раскоментить, то вот такой вот вариантик ещё нарисуется. По моему неплохой.

Давно уже делал это всё, ща вот отрыл. По идее должен даже с точностью до секунды определять)

Link to comment
Share on other sites

  • 0

о какая хератень получилась... я 2 часа думал ошибка, а ведь всё правильно...

с 6 декабря по 1 марта пройдёт какое то колво месяцев + 26 дней

при этом с 6 декабря по 28 февраля пройдёт какое то колво месяцев +22 дня

ведь оба утверждения верны, но при разнице в 1 день, разница в днях 4

получаем, что от 6 декабря 2011

по 28 февраля 2013

1 год 2 месяца 22 дня

или 14 месяцев, 22 дня

или 450 дней

по 1 марта 2013

1 год 2 месяца 26 дней

или 14 месяцев 26 дней

или 451 день

(это я своим кодом насчитал, пойду код psywalker-а изучать)

Edited by iillyyaa2
Link to comment
Share on other sites

  • 0

Можно попробовать так:

1. Определяем функцию, которая считает количество дней в текущем месяце.

countDays(currenIndex)

2. К индексу текущей даты прибавляем значение функции.

indexDate.setDate(indexDate.getDate() + countDays(currenIndex));

3.Организуем цикл сравниваем индекс текущей даты с будущей датой.

 while (indexDate < untilDate)

Если ложь, то высчитаем с будущей даты текущую.

Если тру то крутим цикл, внутри цикла:

1. и к индексу текущей даты и к самой текущей дате прибавляем значение функции:

currenDate.setDate(currenDate.getDate() + countDays(currenIndex));
indexDate.setDate(indexDate.getDate() + countDays(currenIndex));

2. организуем счетчик для количества лет.

вытаскиваем год текущей даты и сравниваем со следующим годом. Если равны, то счетчик +1.

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

а вот месяц не получается у меня считать.

Примерно так:

http://learn.javascript.ru/play/KR2RRb

Edited by cheburek
Link to comment
Share on other sites

  • 0

да тут косяк в том, что, всё зависит от того, что сначала считать... от перестановки мест слагаемых сумма то меняется...

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

Link to comment
Share on other sites

  • 0

вот вам пример:

...
<div id="dd0"> </div>
<div id="dd1"> </div>
<div id="dd2"> </div>
<div id="dd3"> </div>
<script>
var MM = 3;
var DD = 99;

var d0 = new Date();
document.getElementById('dd0').innerHTML = d0;

var d1 = new Date(d0.getFullYear(), d0.getMonth()*1+MM, d0.getDate()*1+DD, d0.getHours(), d0.getMinutes(), d0.getSeconds());
document.getElementById("dd1").innerHTML = d1;

var d2 = new Date(d0.getFullYear(), d0.getMonth()*1+MM, d0.getDate(), d0.getHours(), d0.getMinutes(), d0.getSeconds());
d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate()*1+DD, d2.getHours(), d2.getMinutes(), d2.getSeconds());
document.getElementById("dd2").innerHTML = d2;

var d3 = new Date(d0.getFullYear(), d0.getMonth(), d0.getDate()*1+DD, d0.getHours(), d0.getMinutes(), d0.getSeconds());
d3 = new Date(d3.getFullYear(), d3.getMonth()*1+MM, d3.getDate(), d3.getHours(), d3.getMinutes(), d3.getSeconds());
document.getElementById("dd3").innerHTML = d3;
</script>

отличие между d2 и d3 в том, что:

у d2 мы сначала прибавляем месяцы а потом дни

у d3 мы сначала прибавляем дни а потом месяцы

результат на лицо.

это всё меня немного вогнало в ступор

Edited by iillyyaa2
Link to comment
Share on other sites

  • 0

Общая идея примерно такая (Y0, m0, d0 и Y1, m1, d1 — год, месяц и день начальной и конечной даты, соотв-но, конечная дата позже начальной):

1) Грубо прикидываем разницу лет: dY = Y1 - Y2

2) Если m0 > m1 или (m0 == m1 и d0 > d1), то уменьшаем dY на 1 год, увеличиваем m1 на 12;

3) Прикидываем разницу месяцев сверх разницы лет: dm = m1 - m2

4) Если d0 > d1, то уменьшаем dm на 1 месяц, увеличиваем d1 на число дней в месяце m0 (определяется как "0-й день следующего месяца");

5) Определяем разницу дней сверх разницы лет и месяцев: dd = d1 - d0.

6) Общее кол-во месяцев между датами: dM = dm + dY * 12

7) Общее кол-во дней между датами: а вот тут, имхо, вполне можно взять разницу таймстемпов по UTC да поделить на 86.4 миллиона миллисекунд :)

Link to comment
Share on other sites

  • 0

Уф, работает! :)

http://learn.javascript.ru/play/ghgt4

Все проще оказалось, не нужно месяц считать, в цикле каждая итерация это месяц.

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

Поэтому нужно итерацию считать, когда дойдет до 12 -> счетчик года увеличиваем на 1, а счетчик месяца обнуляем.

Получается месяц - это последняя итерация.

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

Link to comment
Share on other sites

  • 0

А вот мой вариант. Похоже, алгоритм был еще проще (и логичнее), чем я написал выше...

Только у тебя между 27.02.2011 и 01.03.2012 один год и два дня, а между 27.02.2012 и 01.03.2013 - один год и три дня. А на самом деле должно быть два дня, так как год високосный и в нем 366 дней

Link to comment
Share on other sites

  • 0

Это условность подсчета. Я считаю так: 12 полных месяцев (с марта '12 по февраль '13) + 1 марта '13 (конечная дата у меня идет включительно, т.к. между соседними днями разница 1 день) + 28 и 29 февраля '12. Вот три дня и набегает... :)

Link to comment
Share on other sites

  • 0

SelenIT, классное решение для счета количество дней.

function daysInMonth(year, month) {
return (new Date(year, month+1, 0).getDate());
}

Не знала, что как аргумент даты можно использовать 0. Как тут работает getDate? Интуитивно вроде понимаю, а вот анализировать не могу.

а у меня варварская арифметика :)

indexDay = Math.round((new Date(fullYear, monthNext) - new Date(fullYear, month))/(24*60*60*1000));

Edited by cheburek
Link to comment
Share on other sites

  • 0
Как тут работает getDate?

Даты с некорректными параметрами автоматически переводятся в нормальные. Например, 32 декабря автоматом превращается в 1 января следующего года, ну а 0-е число любого месяца — соотв-но, в последнее число предыдущего. Кроме прочего, этим можно пользоваться для валидации даты, не заводя массива констант: если дату распарсить, подставить части в new Date() и перевести в оригинальный формат, для правильной даты результат должен совпасть с оригиналом, а если не совпал — значит, дата недопустимая.

Link to comment
Share on other sites

  • 0
Как тут работает getDate?

Кроме прочего, этим можно пользоваться для валидации даты, не заводя массива констант: если дату распарсить, подставить части в new Date() и перевести в оригинальный формат, для правильной даты результат должен совпасть с оригиналом, а если не совпал — значит, дата недопустимая.

А можно пример? :blush:

Link to comment
Share on other sites

  • 0

я написал считалку, но чуть занят и никак не найду ошибку, мне нужно порой высчитать через сколько дней наступит событие... и вот там какой то косяк... ошибка в несколько дней, как если сначала дни прибавить потом месяцы (или наоборот)

ваши примеры чуть другие...

Link to comment
Share on other sites

  • 0



А такой алгоритм не сработает? Вроде ничего сложного.

Можно добавить и часы/минуты/секунды, но тогда кол- во итераций возрастет значительно.

Упс... Логика была в корне не верна =)

Edited by Odrin
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy