Подтвердить что ты не робот

Как вы вычитаете Даты в Java?

Мое сердце кровоточит внутренне после того, как нужно пройти настолько глубоко, чтобы вычесть две даты, чтобы рассчитать интервал в количестве дней:

    GregorianCalendar c1 = new GregorianCalendar();
    GregorianCalendar c2 = new GregorianCalendar();
    c1.set(2000, 1, 1);
    c2.set(2010,1, 1);
    long span = c2.getTimeInMillis() - c1.getTimeInMillis();
    GregorianCalendar c3 = new GregorianCalendar();
    c3.setTimeInMillis(span);
    long numberOfMSInADay = 1000*60*60*24;
    System.out.println(c3.getTimeInMillis() / numberOfMSInADay); //3653

где это всего 2 строки кода в .NET или любой современный язык, который вы называете.

Является ли это зверством java? Или есть скрытый метод, который я должен знать?

Вместо использования GregorianCalendar, нормально ли использовать класс Date в утилите? Если да, то следует ли мне следить за такими тонкими вещами, как 1970 год?

Спасибо

4b9b3361

Ответ 1

Это действительно один из самых больших эпических сбоев в стандартном Java API. Немного терпения, то вы получите свое решение в аромате нового API дат и времени, указанного JSR 310/ThreeTen, который является ( скорее всего), которые будут включены в будущую Java 8.

До тех пор вы можете уйти с JodaTime.

DateTime dt1 = new DateTime(2000, 1, 1, 0, 0, 0, 0);
DateTime dt2 = new DateTime(2010, 1, 1, 0, 0, 0, 0);
int days = Days.daysBetween(dt1, dt2).getDays();

Его создатель, Стивен Коулборн, кстати, парень позади JSR 310, поэтому он будет выглядеть очень похожим.

Ответ 2

Вы можете использовать следующий подход:

SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd");

long d1=formater.parse("2001-1-1").getTime();
long d2=formater.parse("2001-1-2").getTime();

System.out.println(Math.abs((d1-d2)/(1000*60*60*24)));

Ответ 3

Если вы занимаетесь датами, это хорошая идея, чтобы посмотреть библиотеку времени joda для более разумной модели манипуляции Date.

http://joda-time.sourceforge.net/

Ответ 4

Ну, вы можете удалить третий экземпляр календаря.

GregorianCalendar c1 = new GregorianCalendar();
GregorianCalendar c2 = new GregorianCalendar();
c1.set(2000, 1, 1);
c2.set(2010,1, 1);
c2.add(GregorianCalendar.MILLISECOND, -1 * c1.getTimeInMillis());

Ответ 5

Здесь основной подход,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

Date beginDate = dateFormat.parse("2013-11-29");
Date endDate = dateFormat.parse("2013-12-4");

Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);

Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);

Существует простой способ его реализации. Мы можем использовать метод Calendar.add с циклом. Минус-дни между beginDate и endDate и реализованный код ниже,

int minusDays = 0;
while (true) {
  minusDays++;

  // Day increasing by 1
  beginCalendar.add(Calendar.DAY_OF_MONTH, 1);

  if (dateFormat.format(beginCalendar.getTime()).
            equals(dateFormat.format(endCalendar).getTime())) {
    break;
  }
}
System.out.println("The subtraction between two days is " + (minusDays + 1));**