В этой статье показано несколько примеров сравнения двух дат на Java. Обновлено примерами Java 8.
- 1. Сравните две даты
- 1.1 Дата.Сравнение
- 1.2 Дата. до(), Дата.после() и Дата.равно()
- 1.3 Проверьте, находится ли дата в определенном диапазоне
- 2. Сравните два календаря
- 3. Сравните две даты и время( Java 8)
- 3.1 Сравнение двух локальных данных
- 3.2 Сравнение двух локальных значений времени
- 3.3 Сравните два Моментальный
- 4 Проверьте, находится ли дата в определенном диапазоне (Java 8)
- 5 Проверьте, не старше ли дата 6 месяцев
- Рекомендации
1. Сравните две даты
Для унаследованного java.util. Дата , мы можем использовать Сравнение , до() , после() и равно() для сравнения двух дат.
1.1 Дата.Сравнение
Ниже приведен пример использования Date.compareTo для сравнения двух java.util. Дата на языке Java.
- Возвращаемое значение 0, если дата аргумента равна
Дата. - Возвращаемое значение больше 0 или положительное, если
Датанаходится после даты аргумента. - Возвращаемое значение меньше 0 или отрицательное, если
Датанаходится перед датой аргумента.
Просмотрите подпись метода Date.compareTo .
package java.util; public class Date implements java.io.Serializable, Cloneable, Comparable{ public int compareTo(Date anotherDate) { long thisTime = getMillisOf(this); long anotherTime = getMillisOf(anotherDate); return (thisTime
Например:
package com.mkyong.app;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CompareDate1 {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse("2020-01-30");
Date date2 = sdf.parse("2020-01-31");
System.out.println("date1 : " + sdf.format(date1));
System.out.println("date2 : " + sdf.format(date2));
int result = date1.compareTo(date2);
System.out.println("result: " + result);
if (result == 0) {
System.out.println("Date1 is equal to Date2");
} else if (result > 0) {
System.out.println("Date1 is after Date2");
} else if (result < 0) {
System.out.println("Date1 is before Date2");
} else {
System.out.println("How to get here?");
}
}
}
Выход
date1 : 2020-01-30 date2 : 2020-01-31 result: -1 Date1 is before Date2
Измените дату 1 на 2020-01-31 .
Выход
date1 : 2020-01-31 date2 : 2020-01-31 result: 0 Date1 is equal to Date2
Измените дату 1 на 2020-02-01 .
Выход
date1 : 2020-02-01 date2 : 2020-01-31 result: 1 Date1 is after Date2
1.2 Дата. до(), Дата.после() и Дата.равно()
Ниже приведен более удобный для пользователя метод сравнения двух java.util. Дата на языке Java.
package com.mkyong.app;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CompareDate2 {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//Date date1 = sdf.parse("2009-12-31");
Date date1 = sdf.parse("2020-02-01");
Date date2 = sdf.parse("2020-01-31");
System.out.println("date1 : " + sdf.format(date1));
System.out.println("date2 : " + sdf.format(date2));
if (date1.equals(date2)) {
System.out.println("Date1 is equal Date2");
}
if (date1.after(date2)) {
System.out.println("Date1 is after Date2");
}
if (date1.before(date2)) {
System.out.println("Date1 is before Date2");
}
}
}
Выход
date1 : 2020-02-01 date2 : 2020-01-31 Date1 is after Date2
1.3 Проверьте, находится ли дата в определенном диапазоне
В приведенном ниже примере используется get Time() для проверки, находится ли дата в определенном диапазоне из двух дат (включая дату начала и дату окончания).
package com.mkyong.app;
import java.util.Date;
public class DateRangeValidator {
private final Date startDate;
private final Date endDate;
public DateRangeValidator(Date startDate, Date endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
// inclusive startDate and endDate
// the equals ensure the inclusive of startDate and endDate,
// if prefer exclusive, just delete the equals
public boolean isWithinRange(Date testDate) {
// it works, alternatives
/*boolean result = false;
if ((testDate.equals(startDate) || testDate.equals(endDate)) ||
(testDate.after(startDate) && testDate.before(endDate))) {
result = true;
}
return result;*/
// compare date and time, inclusive of startDate and endDate
// getTime() returns number of milliseconds since January 1, 1970, 00:00:00 GMT
return testDate.getTime() >= startDate.getTime() &&
testDate.getTime() <= endDate.getTime();
}
}
package com.mkyong.app;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateWithinRange {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = sdf.parse("2020-01-01");
Date endDate = sdf.parse("2020-01-31");
System.out.println("startDate : " + sdf.format(startDate));
System.out.println("endDate : " + sdf.format(endDate));
DateRangeValidator checker = new DateRangeValidator(startDate, endDate);
Date testDate = sdf.parse("2020-01-01");
System.out.println("testDate : " + sdf.format(testDate));
if(checker.isWithinRange(testDate)){
System.out.println("testDate is within the date range.");
}else{
System.out.println("testDate is NOT within the date range.");
}
}
}
Выход
startDate : 2020-01-01 endDate : 2020-01-31 testDate : 2020-01-01 testDate is within the date range.
Если мы изменим дату тестирования на 2020-03-01 .
Выход
startDate : 2020-01-01 endDate : 2020-01-31 testDate : 2020-03-01 testDate is NOT within the date range.
2. Сравните два календаря
Для унаследованного java.util. Календарь , Календарь работает так же, как java.util. Дата . И Календарь содержит аналогичное сравнение С , до() , после() и равно() для сравнения двух календарей.
package com.mkyong.app;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CompareCalendar {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse("2020-02-01");
Date date2 = sdf.parse("2020-01-31");
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
System.out.println("date1 : " + sdf.format(date1));
System.out.println("date2 : " + sdf.format(date2));
if (cal1.after(cal2)) {
System.out.println("Date1 is after Date2");
}
if (cal1.before(cal2)) {
System.out.println("Date1 is before Date2");
}
if (cal1.equals(cal2)) {
System.out.println("Date1 is equal Date2");
}
}
}
Выход
date1 : 2020-02-01 date2 : 2020-01-31 Date1 is after Date2
3. Сравните две даты и время( Java 8)
Для нового Java 8 java.время. * классы, все содержат похожие Сравнение , isBefore() , после() и равно() для сравнения двух дат, и это работает одинаково.
ява. время. LocalDate– дата без времени, без часового пояса.ява. время. Местное время– время без даты, без часового пояса.ява. время. LocalDateTime– дата и время, без часового пояса.ява. время. Дата в зоне– дата и время, с указанием часового пояса.ява. время. Мгновенный– секунды, прошедшие со времени эпохи Unix (полночь 1 января 1970 года по UTC).
3.1 Сравнение двух локальных данных
В приведенном ниже примере показано, как сравнить две Локальную дату в Java.
package com.mkyong.app;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class CompareLocalDate {
public static void main(String[] args) throws ParseException {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd");
LocalDate date1 = LocalDate.parse("2020-02-01", dtf);
LocalDate date2 = LocalDate.parse("2020-01-31", dtf);
System.out.println("date1 : " + date1);
System.out.println("date2 : " + date2);
if (date1.isEqual(date2)) {
System.out.println("Date1 is equal Date2");
}
if (date1.isBefore(date2)) {
System.out.println("Date1 is before Date2");
}
if (date1.isAfter(date2)) {
System.out.println("Date1 is after Date2");
}
// test compareTo
if (date1.compareTo(date2) > 0) {
System.out.println("Date1 is after Date2");
} else if (date1.compareTo(date2) < 0) {
System.out.println("Date1 is before Date2");
} else if (date1.compareTo(date2) == 0) {
System.out.println("Date1 is equal to Date2");
} else {
System.out.println("How to get here?");
}
}
}
Выход
date1 : 2020-02-01 date2 : 2020-01-31 Date1 is after Date2 Date1 is after Date2
И мы меняем дату 1 на 2020-01-31 .
Выход
date1 : 2020-01-31 date2 : 2020-01-31 Date1 is equal Date2 Date1 is equal to Date2
3.2 Сравнение двух локальных значений времени
В приведенном ниже примере показано, как сравнить два LocalDateTime в Java, который работает таким же образом.
package com.mkyong.app;
import java.text.ParseException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class CompareLocalDateTime {
public static void main(String[] args) throws ParseException {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
LocalDateTime date1 = LocalDateTime.parse("2020-01-31 11:44:43", dtf);
LocalDateTime date2 = LocalDateTime.parse("2020-01-31 11:44:44", dtf);
System.out.println("date1 : " + date1);
System.out.println("date2 : " + date2);
if (date1.isEqual(date2)) {
System.out.println("Date1 is equal Date2");
}
if (date1.isBefore(date2)) {
System.out.println("Date1 is before Date2");
}
if (date1.isAfter(date2)) {
System.out.println("Date1 is after Date2");
}
}
}
Выход
date1 : 2020-01-31T11:44:43 date2 : 2020-01-31T11:44:44 Date1 is before Date2
3.3 Сравните два Моментальный
Новая Java 8 java.время. Мгновенный , возврат секунд, прошедших с момента времени эпохи Unix (полночь 1 января 1970 года по UTC).
package com.mkyong.app;
import java.text.ParseException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class CompareInstant {
public static void main(String[] args) throws ParseException {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
LocalDateTime date1 = LocalDateTime.parse("2020-01-31 11:44:44", dtf);
LocalDateTime date2 = LocalDateTime.parse("2020-01-31 11:44:44", dtf);
// convert LocalDateTime to Instant
Instant instant1 = date1.toInstant(ZoneOffset.UTC);
Instant instant2 = date2.toInstant(ZoneOffset.UTC);
// compare getEpochSecond
if (instant1.getEpochSecond() == instant2.getEpochSecond()) {
System.out.println("instant1 is equal instant2");
}
if (instant1.getEpochSecond() < instant2.getEpochSecond()) {
System.out.println("instant1 is before instant2");
}
if (instant1.getEpochSecond() > instant2.getEpochSecond()) {
System.out.println("instant1 is after instant2");
}
// compare with APIs
if (instant1.equals(instant2)) {
System.out.println("instant1 is equal instant2");
}
if (instant1.isBefore(instant2)) {
System.out.println("instant1 is before instant2");
}
if (instant1.isAfter(instant2)) {
System.out.println("instant1 is after instant2");
}
}
}
Выход
instant1 : 2020-01-31T11:44:44Z instant2 : 2020-01-31T11:44:44Z instant1 is equal instant2 instant1 is equal instant2
4 Проверьте, находится ли дата в определенном диапазоне (Java 8)
Мы можем использовать простой находится Перед , находится после и равно , чтобы проверить, находится ли дата в определенном диапазоне дат; например, приведенная ниже проверка программы если Местная дата находится в пределах января 2020 года.
package com.mkyong.app;
import java.time.LocalDate;
public class DateRangeValidator {
private final LocalDate startDate;
private final LocalDate endDate;
public DateRangeValidator(LocalDate startDate, LocalDate endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
public boolean isWithinRange(LocalDate testDate) {
// exclusive startDate and endDate
//return testDate.isBefore(endDate) && testDate.isAfter(startDate);
// inclusive startDate and endDate
return (testDate.isEqual(startDate) || testDate.isEqual(endDate))
|| (testDate.isBefore(endDate) && testDate.isAfter(startDate));
}
}
package com.mkyong.app;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class LocalDateWithinRange {
public static void main(String[] args) throws ParseException {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd");
LocalDate startDate = LocalDate.parse("2020-01-01", dtf);
LocalDate endDate = LocalDate.parse("2020-01-31", dtf);
System.out.println("startDate : " + startDate);
System.out.println("endDate : " + endDate);
DateRangeValidator checker = new DateRangeValidator(startDate, endDate);
LocalDate testDate = LocalDate.parse("2020-01-01", dtf);
System.out.println("\ntestDate : " + testDate);
if (checker.isWithinRange(testDate)) {
System.out.println("testDate is within the date range.");
} else {
System.out.println("testDate is NOT within the date range.");
}
}
}
Выход
startDate : 2020-01-01 endDate : 2020-01-31 testDate : 2020-01-01 testDate is within the date range.
Мы можем использовать тот же алгоритм диапазона дат для других классов времени Java 8, таких как Локальное время , Дата в зоне , и Мгновенный .
public boolean isWithinRange(LocalDateTime testDate) {
// exclusive startDate and endDate
//return testDate.isBefore(endDate) && testDate.isAfter(startDate);
// inclusive startDate and endDate
return (testDate.isEqual(startDate) || testDate.isEqual(endDate))
|| (testDate.isBefore(endDate) && testDate.isAfter(startDate));
}
5 Проверьте, не старше ли дата 6 месяцев
Ниже приведен пример проверки того, является ли дата старше 6 месяцев.
package com.mkyong.app;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class PlusMonthExample {
public static void main(String[] args) throws ParseException {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd");
LocalDate now = LocalDate.parse("2020-01-01", dtf);
LocalDate date1 = LocalDate.parse("2020-07-01", dtf);
System.out.println("now: " + now);
System.out.println("date1: " + date1);
// add 6 months
LocalDate nowPlus6Months = now.plusMonths(6);
System.out.println("nowPlus6Months: " + nowPlus6Months);
System.out.println("If date1 older than 6 months?");
// if want to exclude the 2020-07-01, remove the isEqual
if (date1.isAfter(nowPlus6Months) || date1.isEqual(nowPlus6Months)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
Выход
now: 2020-01-01 date1: 2020-07-01 nowPlus6Months: 2020-07-01 If date1 older than 6 months? Yes
Примечание Больше примеров для сравнения или проверки, если дата старше 30 дней или 6 месяцев .
Рекомендации
- Локальная дата JavaDoc
- Локальное время javadoc
- Период JavaDoc
- Java 8 – Как отформатировать LocalDateTime
- Java 8 – Примеры периодов и продолжительности
- Java 8 – Разница между двумя локальными датами или локальным временем
- Java – Проверьте, не старше ли дата 6 месяцев
Оригинал: “https://mkyong.com/java/how-to-compare-dates-in-java/”