Как посчитать раздницу в днях?
От: Незванный_гость  
Дата: 30.05.07 10:06
Оценка:
Не подскажите как правильно вычислить разницу в днях между
дутя датати типа Date. Я пытался перевести Date в миллисекунды, вычислить разницу и
затем обратно, однако возниклм проблемы с округлением, иногда надо прибавлять 1,
а иногда 2, поскольку уроме самой даты учитывается и время. Вычлинять год, месяц и день, но это, я думаю нехорошо, поскольку такие методы объявлены как Deprecated. Как быть?
Re: Как посчитать раздницу в днях?
От: elmal  
Дата: 30.05.07 10:17
Оценка:
Здравствуйте, Незванный_гость, Вы писали:

Н_>Не подскажите как правильно вычислить разницу в днях между

Н_>дутя датати типа Date. Я пытался перевести Date в миллисекунды, вычислить разницу и
Н_>затем обратно, однако возниклм проблемы с округлением, иногда надо прибавлять 1,
Н_>а иногда 2, поскольку уроме самой даты учитывается и время. Вычлинять год, месяц и день, но это, я думаю нехорошо, поскольку такие методы объявлены как Deprecated. Как быть?

Использовать метод add класса календать. Пример:
Calendar passwordDateMinus2 = Calendar.getInstance();
passwordDateMinus2.add(Calendar.DATE, -2);
passwordDateMinus2.add(Calendar.HOUR, 2);

Вычел из текущей даты 1 день 22 часа.
Re: Как посчитать раздницу в днях?
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 30.05.07 10:18
Оценка:
Здравствуйте, Незванный_гость, Вы писали:

Воспользуйтесь поиском, незнамо сколько раз уже обсуждалось.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Re: Как посчитать раздницу в днях?
От: jitm  
Дата: 30.05.07 10:24
Оценка:
Здравствуйте, Незванный_гость, Вы писали:

Н_>Не подскажите как правильно вычислить разницу в днях между

Н_>дутя датати типа 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();

    }
Re[2]: Как посчитать раздницу в днях?
От: Blazkowicz Россия  
Дата: 30.05.07 10:32
Оценка:
Здравствуйте, jitm, Вы писали:

J>Ты прикалываешься ???? Блин, почитай доку прежде чем писать такую лабуду...

Какую доку если не секрет?

J>Вот не самый красывый пример но показывает как надо сделать, как вариант:


Вроде время надо у обеих датвыровнят. Из-за него и может вылезти неточность.
Re[3]: Как посчитать раздницу в днях?
От: jitm  
Дата: 30.05.07 10:55
Оценка:
Здравствуйте, 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 дня тут всё чётко.
Re[4]: Как посчитать раздницу в днях?
От: Blazkowicz Россия  
Дата: 30.05.07 11:01
Оценка:
Здравствуйте, jitm, Вы писали:

J>если интересно можно поексперементировать с Date startDate1 = new GregorianCalendar(2007,4, 28, 13, 45).getTime(); и выставить там допустим Date startDate1 = new GregorianCalendar(2007,4, 28, 15, 45).getTime(); тогда будет 1 день так как втрой ещё не закончился, а если оставить так же то скажет что прошло 2 дня тут всё чётко.


А если эксперементировать возле дат перехода на зимнее/летнее время?
Re[4]: Как посчитать раздницу в днях?
От: Blazkowicz Россия  
Дата: 30.05.07 11:04
Оценка:
Здравствуйте, jitm, Вы писали:

B>>Какую доку если не секрет?

J>да любою ну вот допустим
Это не дока, это независимые лекции.
Дока это вот
Но ни там ни там не сказано что
(diff / (1000L*60L*60L*24L))
достаточно надежный способ.
Re[3]: Как посчитать раздницу в днях?
От: jitm  
Дата: 30.05.07 11:05
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, jitm, Вы писали:


J>>Ты прикалываешься ???? Блин, почитай доку прежде чем писать такую лабуду...

B>Какую доку если не секрет?

Вот хорошая дока здесь
Re[5]: Как посчитать раздницу в днях?
От: jitm  
Дата: 30.05.07 11:19
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, jitm, Вы писали:


B>>>Какую доку если не секрет?

J>>да любою ну вот допустим
B>Это не дока, это независимые лекции.
B>Дока это вот
B>Но ни там ни там не сказано что
B>(diff / (1000L*60L*60L*24L))
B>достаточно надежный способ.
Я и не пыталься доказать что это надёжный способ, я с самого начала написал что это не совсем хороший пример, но он работает и ничёго не надо плюсовать, на счёт перевода времени то если мне память не изменяет с версии j2sdk1.4.2_13 сан зафиксил эту проблему.
Re[6]: Как посчитать раздницу в днях?
От: Незванный_гость  
Дата: 30.05.07 11:39
Оценка:
Здравствуйте, 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).
Re[7]: Как посчитать раздницу в днях?
От: jitm  
Дата: 30.05.07 11:59
Оценка:
Здравствуйте, Незванный_гость, Вы писали:

Н_>Но ваш пример не работает верно, в смысле он не считает хорошо дни. Поскольку, например поставте в вшем коде 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 токо третьи сутки.
Re[8]: Как посчитать раздницу в днях?
От: Незванный_гость  
Дата: 30.05.07 12:11
Оценка:
Здравствуйте, 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. и мне вовсе не нужна привязка к часу с которого начался отсчет, я учитываю только день.
Re: Как посчитать раздницу в днях?
От: aka50 Россия  
Дата: 30.05.07 12:28
Оценка: 5 (1)
Здравствуйте, Незванный_гость, Вы писали:

Н_>Не подскажите как правильно вычислить разницу в днях между

Н_>дутя датати типа Date. Как быть?

Если нужен точный расчет дат, могу посоветовать http://joda-time.sourceforge.net/
public Days daysToNewYear(LocalDate fromDate) {
  LocalDate newYear = fromDate.plusYears(1).withDayOfYear(1);
  return Days.daysBetween(fromDate, newYear);
}
Re[2]: Как посчитать раздницу в днях?
От: Незванный_гость  
Дата: 30.05.07 13:09
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, Незванный_гость, Вы писали:


R>Воспользуйтесь поиском, незнамо сколько раз уже обсуждалось.


Я посмотрел поиск, но ниченого конкретного не нашел (для Java) но как получить разницу в днях для двух дат типа Date ответа нет, особенно как учесть разницу с TimeZone и т.д.
Нпример, если воспользоваться приведенным ниже примекром с приведением к миллисекундам, то надо делать много проверок. Ну скажем случаи, когда дата начала 10 часов 30 мая 2007, а дата окончания 11 часов 30 мая 2007 и симметричная ей ситуация (т.е. даты поменяны местами) понятно, что в таких случаях ответ должен быть одним и темже (можно принять его за 1 день, а можно за 0). Как разбирать такие ситуации хорошо, я не заняю
Re[3]: Как посчитать раздницу в днях?
От: Blazkowicz Россия  
Дата: 30.05.07 13:22
Оценка:
Здравствуйте, Незванный_гость, Вы писали:

Н_>Нпример, если воспользоваться приведенным ниже примекром с приведением к миллисекундам, то надо делать много проверок. Ну скажем случаи, когда дата начала 10 часов 30 мая 2007, а дата окончания 11 часов 30 мая 2007 и симметричная ей ситуация (т.е. даты поменяны местами) понятно, что в таких случаях ответ должен быть одним и темже

(можно принять его за 1 день, а можно за 0). Как разбирать такие ситуации хорошо, я не заняю
С помощью класса Calendar время можно сбрасывать в 0, и только потом производить расчет
Re: Как посчитать раздницу в днях?
От: Незванный_гость  
Дата: 31.05.07 08:41
Оценка:
Пишу следующее:
Date d = new Date();
Calendar cl = new GregorianCalendar();
cl.setTime(d);
cl.set(Calendar.HOUR, 0);
cl.set(Calendar.MINUTE, 0);
cl.set(Calendar.SECOND, 0);
cl.set(Calendar.MILLISECOND, 0);
d.setTime(cl.getTimeInMillis());
System.out.printf("%tc  %tc", d, cl.getTime());


В итоге получаем:
Чт май 31 12:00:00 MSD 2007 Чт май 31 12:00:00 MSD 2007

Почему часов 12, а не 0, как указано в
cl.set(Calendar.HOUR, 0);
Re[2]: Как посчитать раздницу в днях?
От: Аноним  
Дата: 31.05.07 08:47
Оценка: +1
Здравствуйте, Незванный_гость, Вы писали:

Н_>Пишу следующее:

Н_>
Н_>Date d = new Date();
Н_>Calendar cl = new GregorianCalendar();
Н_>cl.setTime(d);
Н_>cl.set(Calendar.HOUR, 0);
Н_>cl.set(Calendar.MINUTE, 0);
Н_>cl.set(Calendar.SECOND, 0);
Н_>cl.set(Calendar.MILLISECOND, 0);
Н_>d.setTime(cl.getTimeInMillis());
Н_>System.out.printf("%tc  %tc", d, cl.getTime());
Н_>


Н_>В итоге получаем:

Н_>Чт май 31 12:00:00 MSD 2007 Чт май 31 12:00:00 MSD 2007

Н_>Почему часов 12, а не 0, как указано в

Н_>
Н_>cl.set(Calendar.HOUR, 0);
Н_>



Попробуй cl.set(Calendar.HOUR_OF_DAY, 0);
Re[3]: Как посчитать раздницу в днях?
От: Blazkowicz Россия  
Дата: 31.05.07 09:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Попробуй cl.set(Calendar.HOUR_OF_DAY, 0);


RTFM одним словом.
Re[2]: Как посчитать раздницу в днях?
От: Cyberax Марс  
Дата: 31.05.07 10:39
Оценка:
Здравствуйте, jitm, Вы писали:

J>Ты прикалываешься ???? Блин, почитай доку прежде чем писать такую лабуду...

J>Вот не самый красывый пример но показывает как надо сделать, как вариант:
Этот код — неверный. Нужна разница в днях, а не в миллисекундах.

А "день" — это величина переменная. Он может быть длиной от 22 часов 59 минут 59 секунд до 25 часов 60 секунд. Это если учесть leap seconds и DST.
Sapienti sat!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.