Как вы вычитаете Даты в 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 год?
Спасибо
Ответы
Ответ 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));**