Как я могу найти количество дней между двумя датами?

У меня два Date. Как я могу определить разницу между этими двумя датами в днях?

Я слышал о SimpleDateFormat, но не знаю, как его использовать.

Я пробовал это:

String fromdate = "Apr 10 2011";

SimpleDateFormat sdf;
sdf = new SimpleDateFormat("MMM DD YYYY"); 

sdf.parse(fromdate);

Calendar cal = Calendar.getInstance();
cal.setTime(sdf);

Я также пробовал это:

String date1 = "APR 11 2011";
String date2 = "JUN 02 2011";
String format = "MMM DD YYYY";
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date dateObj1 = sdf.parse(date1);
Date dateObj2 = sdf.parse(date2);
long diff = dateObj2.getTime() - dateObj1.getTime();
int diffDays = (int) (diff / (24* 1000 * 60 * 60));
System.out.println(diffDays);

но я получил исключение «Недопустимый символ шаблона« Y »».


person Pavan    schedule 02.06.2011    source источник
comment
Что вы подразумеваете под различием? Вы хотите проверить, какой из них находится дальше во времени, или вы просто хотите знать, отличаются ли они?   -  person Op De Cirkel    schedule 02.06.2011
comment
Разница в чем? Миллисекунды? Дней? Дни, часы, минуты? И т. д. Обратите внимание, что DD и YYYY – это недопустимые шаблоны для дней и лет. Прочтите javadoc: download.oracle.com/javase/ 6/docs/api/java/текст/   -  person BalusC    schedule 02.06.2011
comment
Большое спасибо, мне нужна разница в днях   -  person Pavan    schedule 02.06.2011
comment
Я пробовал так: String date1 = APR 11 2011; Строка date2 = 02 июня 2011 г .; Строковый формат = МММ ДД ГГГГ; SimpleDateFormat sdf = новый SimpleDateFormat (формат); Дата dateObj1 = sdf.parse(date1); Дата dateObj2 = sdf.parse(date2); длинная разность = dateObj2.getTime() - dateObj1.getTime(); int diffDays = (int) (diff/(24*1000*60*60)); System.out.println(diffDays); но получение символа недопустимого шаблона Exception 'Y'   -  person Pavan    schedule 02.06.2011
comment
сделайте его y таким, как этот Формат строки = MMM DD yyyy;   -  person Piraba    schedule 24.02.2012


Ответы (5)


Другие ответы верны, но устарели.

Java.время

Построена структура java.time. в Java 8 и выше. Эти классы заменяют старые проблемные классы даты и времени, такие как java.util.Date, .Calendar и java.text.SimpleDateFormat. Команда Joda-Time также рекомендует перейти на java.time.

Чтобы узнать больше, см. учебник по Oracle. И поищите множество примеров и пояснений в Stack Overflow.

Большая часть функций java.time обратно перенесена на Java 6 и 7 в ThreeTen-Backport и далее. адаптировано для Android в ThreeTenABP.

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательным полигоном для возможных дополнений к java.time в будущем.

LocalDate

Класс LocalDate представляет значение только для даты. без времени суток и без часового пояса.

Я предлагаю использовать стандартные форматы ISO 8601 для ваших строк, где это возможно. Но в вашем случае нам нужно указать шаблон форматирования.

String input = "Apr 10 2011";

DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu" );
LocalDate earlier = LocalDate.parse ( input , f );

DateTimeFormatter formatterOut = DateTimeFormatter.ofLocalizedDate ( FormatStyle.MEDIUM ).withLocale ( Locale.US );
String output = earlier.format ( formatterOut );

LocalDate later = earlier.plusDays ( 13 );

long days = ChronoUnit.DAYS.between ( earlier , later );

Дамп на консоль.

System.out.println ( "from earlier: " + earlier + " to later: " + later + " = days: " + days + " ending: " + output );

от более раннего: 2011-04-10 до более позднего: 2011-04-23 = дней: 13 окончание: 10 апреля 2011 г.

person Basil Bourque    schedule 09.08.2016

Вот статья, которая использует Календарь для решения этой проблемы. http://tripoverit.blogspot.com/2007/07/java-calculate-difference-between-two.html

Я считаю, что Joda Time также предоставляет поддержку API для этого сценария.

person nsfyn55    schedule 02.06.2011
comment
Код в сообщении блога не работает, если сравниваемые даты приходятся на разное время в один и тот же день. Он вернет разницу 1, когда она должна быть 0 - person robjwilkins; 30.10.2015

У вас есть два объекта Date?

Ответ не может быть проще.

public double computeDaysBetweenDates(Date d1, Date d2) {
    long diff;

    diff = d2.getTime() - d1.getTime();
    return ((double) diff) / (86400.0 * 1000.0);
}

Объекты Date представляют собой тонкие обертки вокруг long, содержащие время UTC POSIX EPOCH, которое представляет собой количество миллисекунд, прошедших с полуночи 1 января 1970 года по всемирному координированному времени. Вы получаете интервал в миллисекундах, просто вычитая более раннее значение из более позднего. Зная это, вы просто делите на количество миллисекунд в сутках.

Обратите внимание, что в этом ответе предполагается, что день составляет 86400 секунд, и... в основном это правда.

Обратите внимание, что это решение по-прежнему подходит, даже если у вас есть отформатированные строки даты. Если вы можете сначала проанализировать дату/время в объектах Date, вы все равно можете вызвать эту функцию с ними.

person scottb    schedule 03.05.2013
comment
В этом посте указано только количество 24-часовых периодов между двумя датами, а не количество календарных дней. - person robjwilkins; 30.10.2015
comment
В чем разница между разницей в днях и разницей в календарных днях? - person scottb; 08.11.2015

Этот код должен показать вам, как делать то, что вам нужно...

public static void main(String[] args) {
    Calendar firstOfTheMonthCalendar = Calendar.getInstance();
    firstOfTheMonthCalendar.set(Calendar.DAY_OF_MONTH, 1);

    Date firstOfTheMonthDate = firstOfTheMonthCalendar.getTime();
    Date nowDate = new Date();

    int diffInDays = determineDifferenceInDays(firstOfTheMonthDate, nowDate);
    System.out.println("Number of days betweens dates: " + diffInDays);
}

private static int determineDifferenceInDays(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    long diffInMillis = calendar2.getTimeInMillis() - calendar1.getTimeInMillis();
    return (int) (diffInMillis / (24* 1000 * 60 * 60));
}
person Jesse Webb    schedule 02.06.2011
comment
Я прочитал сообщение в блоге, на которое есть ссылка в ответе nsfyn55, и, похоже, мое решение не будет работать в некоторых часовых поясах. В статье показан более точный способ решения этой проблемы, но мой ответ должен работать в большинстве случаев. - person Jesse Webb; 03.06.2011

Разница между двумя строками даты в java

это поможет вам получить некоторое представление

person RanRag    schedule 02.06.2011