hubert
41 уровень

Говнокод #4

Пост из группы Архив info.javarush.ru
3681 участников
public static int daysBetween(Date startDate, Date endDate) { int difInDays = (int) ((endDate.getTime() - startDate.getTime())/(1000*60*60*24)); }
Комментарии (9)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизироваться
IvanDurov 25 уровень
27 апреля 2014, 00:10
Недавно делал, оставил так:
int days = Period.between(startDate, endDate).getDays();
Anton_n 33 уровень, Москва
24 апреля 2014, 21:40
В какой-то из задачек я делал вроде именно так :)

Объясните, плиз, чем этот код плох.
phashik 28 уровень
25 апреля 2014, 12:48
Всё сильно зависит от цели, с которой мы эту разницу вычисляем. Но сразу в глаза бросается то, что 23 часа 59 минут такой метод переведет в 0 дней, что редко будет справедливым (хотя иногда так и должно быть).
Сам бы я написал такой говнокод:
public static int daysBetween(Date startDate, Date endDate)
{
     int difInHours = (int) ((endDate.getTime() - startDate.getTime())/(1000*60*60));
     int difInDays = (difInHours + 12) / 24;
}
Anton_n 33 уровень, Москва
25 апреля 2014, 13:14
Скорее тут проблема, что исходный код дает разницу в сутках, а надо узнать количество дней между двумя датами. Например между 0:10 1 января и 23:00 3 января вычислит как два дня, хотя на самом деле там только один день — 2 января. Т.е. раннюю дату надо привести к полночи текущего дня (минутой позже после 23:59), а позднюю — к 0:00. И после этого уже вычислить разницу.
phashik 28 уровень
25 апреля 2014, 13:19
Воу-воу! Как вы опрометчиво утверждаете «надо узнать количество дней между двумя датами». Тут даже условия нигде нет! Но с вашей формулировкой задачи ваши рассуждения справедливы, наверное.
ps: не хочу спорить, но напомню, что «Всё сильно зависит от цели, с которой мы эту разницу вычисляем.» и именно этого нам пока что никто не сказал.
Anton_n 33 уровень, Москва
25 апреля 2014, 14:01
Да, согласен. Поэтому не очень ясно, почему оно говнокод :)
MSBlast 30 уровень, Тула, Москва
22 апреля 2014, 18:24
На stackoverflow все советуют использовать чудо библиотеку Joda. С применением которой код выглядел бы так:

import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.Days;

public static int daysBetween(Date startDate, Date endDate)
{
return Days.daysBetween(new DateTime(startDate), new DateTime(endDate)).getDays();
}


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

public static int daysBetween(Date startDate, Date endDate)
{
    Calendar c1 = Calendar.getInstance();
    c1.setTime(startDate);
    Calendar c2 = Calendar.getInstance();
    c2.setTime(endDate);
    int daysBetween = 0;
    while (c1.before(c2))
    {
      c1.add(Calendar.DAY_OF_MONTH,1);
        daysBetween++;
    }
    return daysBetween;
}
SergeyKandalintsev 32 уровень, Днепр
22 апреля 2014, 19:25
исходный пример тоже високосный год учитывал
Bessus 41 уровень, Франкфурт
24 апреля 2014, 00:47
Исходный пример не учитывал смену зимнего/летнего времени.