Я принимаю две даты в качестве аргументов командной строки и хочу проверить, не первый ли после второй даты. формат даты "dd/MM/yyy". Пример: java dateCheck 01/01/2014 15/03/2014, также мне нужно будет проверить, была ли третья дата, запрограммированная в программе, до второй даты.
try {
System.out.println("Enter first date : (dd/MM/yyyy)");
BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date1 = sdf.parse(bufferRead.readLine());
System.out.println("Enter second date : (dd/MM/yyyy)");
Date date2 = sdf.parse(bufferRead.readLine());
System.out.println(date1 + "\n" + date2);
if (date1.after(date2)) {
System.out.println("Date1 is after Date2");
} else {
System.out.println("Date2 is after Date1");
}
} catch (IOException e) {
e.printStackTrace();
}
Чтобы сравнить две даты:
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyy");
Date firstDate = sdf.parse("01/01/2014");
Date secondDate = sdf.parse("15/03/2014");
if(firstDate.before(secondDate)){
System.out.println("firstDate < secondDate");
}
else if(firstDate.after(secondDate)){
System.out.println("firstDate > secondDate");
}
else if(firstDate.equals(secondDate)){
System.out.println("firstDate = secondDate");
}
LocalDate ld1 = LocalDate.parse( "01/01/2014" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ;
LocalDate ld2 = LocalDate.parse( "15/03/2014" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ;
LocalDate ld3 = LocalDate.of( 2014 , Month.JULY , 1 ) ;
Boolean isFirstDateBeforeSecondDate = ld1.isBefore( ld2 ) ;
Boolean isThirdDateBeforeSecondDate = ld3.isBefore( ld2 ) ;
Boolean result = ( isFirstDateBeforeSecondDate && isThirdDateBeforeSecondDate ) ;
return result ;
В современном подходе используются классы java.time, а не хронические старые устаревшие классы времени (Date
, Calendar
и т.д.).
Класс LocalDate
представляет значение даты только без времени и без часового пояса.
Определите шаблон форматирования, соответствующий вашим входным строкам, используя класс DateTimeFormatter
.
String input = "15/03/2014" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( input , f );
ld.toString(): 2014-03-15
Чтобы указать фиксированную дату, укажите год, месяц и деньOfMonth. В течение месяца вы можете указать число, состоящее из 1-12 за январь-декабрь (в отличие от сумасшедшего 0-11 в унаследованных классах!). Или вы можете использовать объекты перечисления Month
.
LocalDate firstOf2014 = LocalDate.of( 2014 , Month.JANUARY , 1 );
Сравните с использованием isBefore
, isEqual
или isAfter
.
Boolean isInputDateBeforeFixedDate = ld.isBefore( firstOf2014 ) ;
isInputDateBeforeFixedDate.toString(): false
Если возможно, замените свой формат строки даты на стандартный формат ISO 8601. Этот стандарт определяет множество полезных практических однозначных строковых форматов для значений даты и времени.
Классы java.time используют стандартные форматы по умолчанию при разборе/генерации строк. Вы можете увидеть примеры в приведенном выше коде. Для значения только для даты стандартным форматом является YYYY-MM-DD.
Рамка java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.
Где можно получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
Используйте SimpleDateFormat для преобразования строки в Date.
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date1 = sdf.parse("01/01/2017");
Дата имеет до и после методов и может сравниваться друг с другом следующим образом:
if(todayDate.after(historyDate) && todayDate.before(futureDate)) {
// In between
}
Для инклюзивного сравнения:
if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
/* historyDate <= todayDate <= futureDate */
}
Чтобы прочитать дату и проверить до:
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyy");
try {
Date date1 = sdf.parse(string1);
Date date2 = sdf.parse(string2);
if(date1.before(date2)) {
// do something
}
} catch(ParseException e) {
// the format of the read dates is not the expected one
}
java.util.Date
,java.util.Calendar
иjava.text.SimpleTextFormat
, теперь унаследованы и заменены классами java.time .