Сравняване на дати, пренебрегване на моментите от секунди и милисекунди на DateTime в Joda

Да приемем, че имам две дати като следните.

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45");
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45");

Искам да сравня тези две дати, за да видя дали firstDate е по-рано, по-късно или е равно на secondDate.

Мога да опитам следното.

System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.isBefore(secondDate));
System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.isAfter(secondDate));
System.out.println("firstDate = "+firstDate+"\nsecondDate = "+secondDate+"\ncomparison = "+firstDate.equals(secondDate));

Това, което се получава от този код, е точно това, което искам.

Той произвежда следния изход.

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = true

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = false

firstDate = 2012-02-16T12:03:45.000+05:30
secondDate = 2013-02-17T12:03:45.000+05:30
comparison = false

Трябва да игнорирам секундите и частта от милисекунди на тези дати. Опитах се да използвам методите withSecondOfMinute(0) и withMillis(0) като следните.

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45").withSecondOfMinute(0).withMillis(0);
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45").withSecondOfMinute(0).withMillis(0);        

Но даде следния изход.

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = false

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = false

firstDate = 1970-01-01T05:30:00.000+05:30
secondDate = 1970-01-01T05:30:00.000+05:30
comparison = true

Документите на метода withSecondOfMinute() описват.

Връща копие на тази дата и час с актуализирано поле за втората от минутите. DateTime е неизменен, така че няма зададени методи. Вместо това този метод връща нов екземпляр с променена стойност на секунда от минута.

И документите на метода withMillis() казват.

Връща копие на тази дата и час с различни милисекули. Върнатият обект ще бъде или нов екземпляр, или това. Ще се променят само милисите, хронологията и часовата зона се запазват.

Сравняването на дати чрез пълно игнориране на времевата част може лесно да се направи с помощта на DateTimeComparator.getDateOnlyInstance() приблизително като следното.

if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)==0){}
if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)<0){}
if(DateTimeComparator.getDateOnlyInstance().compare(firstDate, secondDate)>0){}

Как да сравним две дати, като игнорираме конкретния момент в DateTime (секунди и милисекунди в този случай)?


person Tiny    schedule 18.02.2013    source източник


Отговори (2)


Мисля, че искате да използвате DateTime#withMillisOfSecond() вместо DateTime#withMillis() :

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime firstDate = formatter.parseDateTime("16-Feb-2012 12:03:45").withSecondOfMinute(0).withMillisOfSecond(0);
DateTime secondDate = formatter.parseDateTime("17-Feb-2013 12:03:45").withSecondOfMinute(0).withMillisOfSecond(0);

Задаване на DateTime#withMillis() на 0, ще нулира и двете ви дати на 1/1/1970 и следователно получавате true за equals обаждане на тях.

По същия начин, задаване на DateTime#withMillisOfDay() на 0, ще настрои часа на midnight.

person Rohit Jain    schedule 18.02.2013
comment
Благодаря ти много. Свършен! - person Tiny; 19.02.2013

Друг подход е да се създаде DateTimeComparator с минута като долна граница:

DateTimeComparator comparator = DateTimeComparator.getInstance(
         DateTimeFieldType.minuteOfHour());

което би игнорирало втората и милисекундната част на сравняваните обекти.

person Steinar    schedule 18.02.2013
comment
Ще опитам този подход по-късно. Благодаря ти. - person Tiny; 19.02.2013