Не подскажите как правильно вычислить разницу в днях между
дутя датати типа Date. Я пытался перевести Date в миллисекунды, вычислить разницу и
затем обратно, однако возниклм проблемы с округлением, иногда надо прибавлять 1,
а иногда 2, поскольку уроме самой даты учитывается и время. Вычлинять год, месяц и день, но это, я думаю нехорошо, поскольку такие методы объявлены как Deprecated. Как быть?
Здравствуйте, Незванный_гость, Вы писали:
Н_>Не подскажите как правильно вычислить разницу в днях между Н_>дутя датати типа Date. Я пытался перевести Date в миллисекунды, вычислить разницу и Н_>затем обратно, однако возниклм проблемы с округлением, иногда надо прибавлять 1, Н_>а иногда 2, поскольку уроме самой даты учитывается и время. Вычлинять год, месяц и день, но это, я думаю нехорошо, поскольку такие методы объявлены как Deprecated. Как быть?
Здравствуйте, Незванный_гость, Вы писали:
Н_>Не подскажите как правильно вычислить разницу в днях между Н_>дутя датати типа Date. Я пытался перевести Date в миллисекунды, вычислить разницу и Н_>затем обратно, однако возниклм проблемы с округлением, иногда надо прибавлять 1, Н_>а иногда 2, поскольку уроме самой даты учитывается и время. Вычлинять год, месяц и день, но это, я думаю нехорошо, поскольку такие методы объявлены как Deprecated. Как быть?
Ты прикалываешься ???? Блин, почитай доку прежде чем писать такую лабуду...
Вот не самый красывый пример но показывает как надо сделать, как вариант:
private static void doDateDifference() {
prt("DIFFERENCE BETWEEN TWO DATES");
prt("=================================================================");
Date startDate1 = new GregorianCalendar(1994, 02, 14, 14, 00).getTime();
Date endDate1 = new Date();;
long diff = endDate1.getTime() - startDate1.getTime();
prt(" Difference between " + endDate1);
prt(" and " + startDate1 + " is " + (diff / (1000L*60L*60L*24L)) + " days.");
prt();
}
Здравствуйте, jitm, Вы писали:
J>Ты прикалываешься ???? Блин, почитай доку прежде чем писать такую лабуду...
Какую доку если не секрет?
J>Вот не самый красывый пример но показывает как надо сделать, как вариант:
Вроде время надо у обеих датвыровнят. Из-за него и может вылезти неточность.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, jitm, Вы писали:
J>>Ты прикалываешься ???? Блин, почитай доку прежде чем писать такую лабуду... B>Какую доку если не секрет?
да любою ну вот допустим
J>>Вот не самый красывый пример но показывает как надо сделать, как вариант:
B>Вроде время надо у обеих датвыровнят. Из-за него и может вылезти неточность.
Какая ??? Если не прошло ещё 24 часа с точностью до милисекунд значит этот день считаться не будет, что в принцыпе и верно так как считаеться только полные законченые сутки а не дни., ну это понятно вот пример модифицировал :
private static void doDateDifference() {
prt("DIFFERENCE BETWEEN TWO DATES");
prt("=================================================================");
Date startDate1 = new GregorianCalendar(2007,4, 28, 13, 45).getTime();
Date endDate1 = new Date();
long diff = endDate1.getTime() - startDate1.getTime();
prt(" Difference between " + endDate1);
prt(" and " + startDate1 + " is " + (diff / (1000L*60L*60L*24L)) + " days.");
prt();
}
если интересно можно поексперементировать с Date startDate1 = new GregorianCalendar(2007,4, 28, 13, 45).getTime(); и выставить там допустим Date startDate1 = new GregorianCalendar(2007,4, 28, 15, 45).getTime(); тогда будет 1 день так как втрой ещё не закончился, а если оставить так же то скажет что прошло 2 дня тут всё чётко.
Здравствуйте, jitm, Вы писали:
J>если интересно можно поексперементировать с Date startDate1 = new GregorianCalendar(2007,4, 28, 13, 45).getTime(); и выставить там допустим Date startDate1 = new GregorianCalendar(2007,4, 28, 15, 45).getTime(); тогда будет 1 день так как втрой ещё не закончился, а если оставить так же то скажет что прошло 2 дня тут всё чётко.
А если эксперементировать возле дат перехода на зимнее/летнее время?
Здравствуйте, jitm, Вы писали:
B>>Какую доку если не секрет? J>да любою ну вот допустим
Это не дока, это независимые лекции.
Дока это вот
Но ни там ни там не сказано что
(diff / (1000L*60L*60L*24L))
достаточно надежный способ.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, jitm, Вы писали:
J>>Ты прикалываешься ???? Блин, почитай доку прежде чем писать такую лабуду... B>Какую доку если не секрет?
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, jitm, Вы писали:
B>>>Какую доку если не секрет? J>>да любою ну вот допустим B>Это не дока, это независимые лекции. B>Дока это вот B>Но ни там ни там не сказано что B>(diff / (1000L*60L*60L*24L)) B>достаточно надежный способ.
Я и не пыталься доказать что это надёжный способ, я с самого начала написал что это не совсем хороший пример, но он работает и ничёго не надо плюсовать, на счёт перевода времени то если мне память не изменяет с версии j2sdk1.4.2_13 сан зафиксил эту проблему.
Здравствуйте, jitm, Вы писали:
J>Здравствуйте, Blazkowicz, Вы писали:
B>>Здравствуйте, jitm, Вы писали:
B>>>>Какую доку если не секрет? J>>>да любою ну вот допустим B>>Это не дока, это независимые лекции. B>>Дока это вот B>>Но ни там ни там не сказано что B>>(diff / (1000L*60L*60L*24L)) B>>достаточно надежный способ. J>Я и не пыталься доказать что это надёжный способ, я с самого начала написал что это не совсем хороший пример, но он работает и ничёго не надо плюсовать, на счёт перевода времени то если мне память не изменяет с версии j2sdk1.4.2_13 сан зафиксил эту проблему.
Но ваш пример не работает верно, в смысле он не считает хорошо дни. Поскольку, например поставте в вшем коде 31 число и получим 0 или 30, тоже ноль. Хотя должно считаться ДатаНачала — ДатаОкончания + 1 (если мы берем дни). Но это и естественно, 30 — 28 = 2, но мы должны включить и начальный день (т.е. само 28).
Здравствуйте, Незванный_гость, Вы писали:
Н_>Но ваш пример не работает верно, в смысле он не считает хорошо дни. Поскольку, например поставте в вшем коде 31 число и получим 0 или 30, тоже ноль. Хотя должно считаться ДатаНачала — ДатаОкончания + 1 (если мы берем дни). Но это и естественно, 30 — 28 = 2, но мы должны включить и начальный день (т.е. само 28).
само 28 считаеться, не считаеться 30, сичтаем вместе 28.05.2007 14.00 — 29.05.2007 14.00 = одни сутки 29.05.2007 14.00 — 30.05.2007 14.00 двое суток а 30.05.2007 14.00 — 31.05.2007 14.00 токо третьи сутки.
Здравствуйте, jitm, Вы писали:
J>Здравствуйте, Незванный_гость, Вы писали:
Н_>>Но ваш пример не работает верно, в смысле он не считает хорошо дни. Поскольку, например поставте в вшем коде 31 число и получим 0 или 30, тоже ноль. Хотя должно считаться ДатаНачала — ДатаОкончания + 1 (если мы берем дни). Но это и естественно, 30 — 28 = 2, но мы должны включить и начальный день (т.е. само 28). J>само 28 считаеться, не считаеться 30, сичтаем вместе 28.05.2007 14.00 — 29.05.2007 14.00 = одни сутки 29.05.2007 14.00 — 30.05.2007 14.00 двое суток а 30.05.2007 14.00 — 31.05.2007 14.00 токо третьи сутки.
Это конечно верно, но мне надо количество дней с 28 по 30, а их очевидно 3, соответственно 28, 29, 30, поскольку 30 мы тоже учитываем до его окончания, т.е. до наступления 31. и мне вовсе не нужна привязка к часу с которого начался отсчет, я учитываю только день.
Здравствуйте, rsn81, Вы писали:
R>Здравствуйте, Незванный_гость, Вы писали:
R>Воспользуйтесь поиском, незнамо сколько раз уже обсуждалось.
Я посмотрел поиск, но ниченого конкретного не нашел (для Java) но как получить разницу в днях для двух дат типа Date ответа нет, особенно как учесть разницу с TimeZone и т.д.
Нпример, если воспользоваться приведенным ниже примекром с приведением к миллисекундам, то надо делать много проверок. Ну скажем случаи, когда дата начала 10 часов 30 мая 2007, а дата окончания 11 часов 30 мая 2007 и симметричная ей ситуация (т.е. даты поменяны местами) понятно, что в таких случаях ответ должен быть одним и темже (можно принять его за 1 день, а можно за 0). Как разбирать такие ситуации хорошо, я не заняю
Здравствуйте, Незванный_гость, Вы писали:
Н_>Нпример, если воспользоваться приведенным ниже примекром с приведением к миллисекундам, то надо делать много проверок. Ну скажем случаи, когда дата начала 10 часов 30 мая 2007, а дата окончания 11 часов 30 мая 2007 и симметричная ей ситуация (т.е. даты поменяны местами) понятно, что в таких случаях ответ должен быть одним и темже
(можно принять его за 1 день, а можно за 0). Как разбирать такие ситуации хорошо, я не заняю
С помощью класса Calendar время можно сбрасывать в 0, и только потом производить расчет
Здравствуйте, jitm, Вы писали:
J>Ты прикалываешься ???? Блин, почитай доку прежде чем писать такую лабуду... J>Вот не самый красывый пример но показывает как надо сделать, как вариант:
Этот код — неверный. Нужна разница в днях, а не в миллисекундах.
А "день" — это величина переменная. Он может быть длиной от 22 часов 59 минут 59 секунд до 25 часов 60 секунд. Это если учесть leap seconds и DST.