1. Java / Говнокод #8288

    +83

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    public static long getDifference(Date date1, Date date2, int unit) {
    	if (date1 == null || date2 == null) {
    		throw new IllegalArgumentException("Date cannot be null!");
    	}
    
    	if (date1.after(date2)) {
    		Date swap = date1;
    		date1 = date2;
    		date2 = swap;
    	}
    		
    	long result = 0;
    	
    	long diff = date2.getTime() - date1.getTime() + (60 * 60 * 1000L);
    		
    	switch (unit) {
    	case Calendar.YEAR:
    		result = diff / (60 * 60 * 24 * 365 * 1000L);
    		break;
    	case Calendar.MONTH:
    		result = diff / (60 * 60 * 24 * 30 * 1000L);
    		break;
    	case Calendar.DAY_OF_YEAR:
    		result = diff / (60 * 60 * 24 * 1000L);
    		break;
    	default:
    		throw new UnsupportedOperationException("Impossible to get time difference in coerced unit.");
    	}
    		
    	return result;
    }

    Опять даты, опять.... Java?
    Удивительно, но этот код использовался в вычислениях, связанных с начислением выплат. Разумеется, считалось всё неправильно, в связи с чем было обнаружено ЭТО.

    Запостил: roman-kashitsyn, 25 Октября 2011

    Комментарии (21) RSS

    • if (date1.after(date2)) {
      Date swap = date1;
      date1 = date2;
      date2 = swap;
      }
      прекрасно! особенно в этом вот контексте.

      >long diff = date2.getTime() - date1.getTime() + (60 * 60 * 1000L);
      менять местами научился, а о модуле числа не знает.
      Ответить
    • Да, даты в Java то еще развлечение.

      Кстати, нафига час к разности прибавлять?

      П. С. Недавно открыл для себя, что бывают случаи когда d1.equals(d2) == false, но d1.compareTo(d2) == 0

      П. С. С. А как это по нормальному переписать? Без использования JodaTime и других сторонних либов?
      Ответить
      • Ну вот сегодня закрыли ведомость как и положено, в 17:00, а вчера припозднились, в 17:01. Ай-яй-яй, 0 дней разницы!

        А может с переходом на летнее время так борются.
        Ответить
    • Так-с ... а где високосность?
      Ответить
      • У чувака, который это писал, в году всегда 365 дней, а в каждом месяце ровно 30 дней и не ипёт
        Ответить
    • а как нормально-то сделать? вообще у Calendar должен быть такой метод, но что-то не нахожу
      Ответить
      • Нет у него метода, но способ есть. В проекте есть классы, которые делают это более правильным способом, но там много кода и он уныл.
        Ответить
      • Для начала — взять-таки Calendar. Чтобы не страдать переводом времени и количеством дней в месяце.

        Для лет — просто разность лет.
        Для месяцев — разность номеров месяцев плюс 12 * разность лет.
        Для дней — разность номеров дней в году плюс сумма дней прошедших лет (в цикле или рассчитывая число високосных вручную).
        Ответить
        • подумал - или использовать одну из формул вечного календаря
          Ответить
          • Главное — правильную.
            Ответить
            • ну я в школьные годы составлял формулу, считающую кол-во дней, прошедших с начала нашей эры, причем, небольшая поправка (+2, вроде бы) - и остаток %7 дает нам правильный день недели
              Ответить
              • школота :-Р
                в середине эры был атец папа Григогий, который формулы пообломал
                Ответить
        • Т. е.
          С 30.10.2011 по 01.01.2012 - 1 год?
          С 30.10.2011 по 01.11.2011 - 1 месяц?
          Ответить
          • Что делать с неполными днями/месяцами/годами — это уже отдельный вопрос, ответ на который зависит от предметной области.
            Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий