java.time и ThreeTen Backport для Java 6
import org.threeten.bp.LocalDate;
import org.threeten.bp.ZoneId;
import org.threeten.bp.format.DateTimeFormatter;
public class ExpiryDateLogic {
public static void main(String[] args) {
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
ZoneId zone = ZoneId.of("Asia/Kolkata");
String expDateString = "07-11-2018"; // Text Date Input
if (expDateString.isEmpty()) {
System.out.println("No Expiry Date Present");
} else {
LocalDate expDate = LocalDate.parse(expDateString, dateFormatter);
LocalDate today = LocalDate.now(zone);
System.out.println("Today: " + today);
System.out.println("Expiration: " + expDate);
if (expDate.isBefore(today)) {
System.out.println("Invalid Expiry Date");
} else {
System.out.println("Valid Expiry Date");
}
}
}
}
Вывод, когда я бегу сегодня (9 ноября):
Today: 2018-11-09
Expiration: 2018-11-07
Invalid Expiry Date
A LocalDate
- это дата без времени суток, поэтому, похоже, она соответствует вашему требованию лучше, чем старомодный Date
, который, несмотря на свое название, является моментом времени, а не датой. Таким образом, приведенный выше код также проще, чем ваш код.
Поскольку это не одна и та же дата во всех часовых поясах, я явно указываю часовой пояс для предсказуемых результатов.
Будет ли это работать на моей Java 6?
Да, java.time требует как минимум Java 6 (я тестировал код выше на Java 7).
- В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) современный API поставляется встроенным. В этом случае импортируйте классы из пакета
java.time
с подпакетами (, а не org.threeten.bp
).
- В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старых) Android используется версия Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Что не так в вашем коде?
В ваших двух форматерах вы используете mm
в месяц, это неправильно. Нижний регистр mm
для минуты часа. Для месяца нужно использовать прописные буквы MM
. Все буквы шаблона формата чувствительны к регистру.
Для класса SimpleDateFormat
характерно просто давать вам неверный результат и делать вид, что все хорошо. Это всего лишь одна из многих проблем с этим классом. И одна из многих причин, почему я предлагаю вместо этого использовать java.time, современный Java-интерфейс даты и времени.
Ссылки