Проверьте, соответствует ли одна дата ровно 24 часа или более после другого

Я использую метод compareTo в Java, чтобы попытаться проверить, превышает ли определенную дату или равно 24 часам после другой даты.

Как определить, какое целое число должно сравнивать дату?

Ответ 1

Ответ зависит от того, чего вы хотите достичь.

В одном случае можно было бы проверить разницу в миллисекундах. 24 часа в миллисекундах можно вычислить через

24  *  60  *  60  *  1000   =  86400000
h      min    sec    millis  

(в коде вы также можете написать TimeUnit.HOURS.toMillis(24), который ИМО более описателен)

Итак, теперь вы можете просто проверить, больше ли разница между двумя датами (выраженная в миллисекундах), чем 86400000.

Ответ 2

Используйте класс Calendar. Если у вас уже есть объект Date, вы можете использовать Calendar:

Date aDate = . . .
Calendar today = Calendar.getInstance();
today.setTime(aDate);
Calendar tomorrow = Calendar.getInstance();
tomorrow.setTime(aDate);
tomorrow.add(Calendar.DAY, 1);
Date tomorrowDate = tomorrow.getTime(); // if you need a Date object

Ответ 3

TL;DR

myUtilDate_B
    .toInstant()
    .equals( 
        myUtilDate_A.toInstant().plus( 24 , ChronoUnit.HOURS ) 
    )  // Exactly 24 hours apart.

... и...

myUtilDate_B
    .toInstant()
    .isAfter( 
        myUtilDate_A.toInstant().plus( 24 , ChronoUnit.HOURS ) 
    )  // Over 24 hours apart.

С другой стороны...

Duration.between( myUtilDate_A , myUtilDate_B )
        .compareTo( Duration.ofHours( 24 ) )  
        // Returns 0 if exactly 24 hours apart, 
        //         >0 if over 24 hours apart.

java.time

Вы специально попросили сравнить два периода времени, чтобы спросить, есть ли:

  • Это ровно на 24 часа позже другого
  • Это более чем на 24 часа позже другого.

Метод compareTo, о котором вы упомянули, не делает этого. Он предназначен только для того, чтобы сказать, является ли момент одним и тем же, позже или раньше. Метод не заботится о конкретных промежутках времени, таких как 24 часа.

Вы конкретно заявили, что дата не имеет значения. Поэтому вы хотите игнорировать аномалии, такие как летнее время (DST), которые делают день более длинным или короче 24 часов.

Итак, мы можем работать в UTC. Нет необходимости в часовых поясах.

Если вы ссылались на объекты java.util.Date, сначала конвертируйте их в объекты java.time. Класс Date является частью проблемных старых классов времени и времени, а также Calendar, которые теперь являются устаревшими, вытесняются классами java.time.

Эквивалент java.util.Date равен java.time.Instant. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунды (до девяти (9) цифр десятичной дроби).

Вы можете конвертировать в/из типов java.time с помощью новых методов, добавленных в старые классы.

Instant start = myUtilDate_Start.toInstant();
Instant stop = myUtilDate_Stop.toInstant();

Определите пробел, о котором мы заботимся, в этом случае двадцать четыре часа, как объект Duration.

Duration d = Duration.ofHours( 24 );  // We mean literally 24 hours, not a day.

Используйте Duration для вычисления значения 24 часа. Определите единицы часов с помощью ChronoUnit enum.

Instant target = start.plus( 24 , ChronoUnit.HOURS );

Наконец, сравните второе значение даты-времени. Вызовите equals и isAfter.

Boolean isExactly24HoursLater = stop.equals( target );
Boolean isOver24HoursLater = stop.isAfter( target );

О java.time

Структура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятный старый legacy классы времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь режим обслуживания, советует перейти на java.time.

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9 и позже
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональных возможностей java.time обратно переносится на Java 6 и 7 в ThreeTen-Backport.
  • Android

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


Joda времени

UPDATE: Проект Joda-Time, теперь в режим обслуживания, советует перейти на классы java.time. Этот раздел оставлен здесь неповрежденным для истории.

Joda-Time упрощает эту работу.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTimeInQuestion = new DateTime( 2014, 1, 2, 3, 4, 5, 6, timeZone );  // Or: new DateTime( someJavaDotUtilDotDateObject );
DateTime now = new DateTime( timeZone );
DateTime twentyFourHoursFromNow = now.plusHours( 24 ); // Ignores Daylight Saving Time (DST). If you want to adjust for that, call: plusDays( 1 ) instead.
DateTime isDateTimeInQuestionAfter24HoursFromNow = dateTime.isAfter( twentyFourHoursFromNow );

1 день ≠ 24 часа

Если вы действительно хотели рассмотреть тот же время настенных часов следующего дня, вызовите plusDays( 1 ), а не plusHours( 24 ). Затем Joda-Time настраивается на летнее время (DST) или другие аномалии. Например, здесь, в Соединенных Штатах, это может означать 25 часов, а не 24 часа из-за нашей 1-часовой глупости DST.

Сравнить в течение 24 часов

Если вы действительно хотите проверить, подходит ли указанное время в течение этого 24-часового промежутка времени, используйте один из трех классов Joda-Time для промежутков времени: интервал, продолжительность и период.

Interval interval = new Interval( now, twentyFourHoursFromNow );
boolean isDateTimeInQuestionContainedWithinNext24Hours = interval.contains( dateTimeInQuestion );

Для такого сравнения Joda-Time использует логику "Half-Open". Это означает, что начальная дата-время включена, в то время как окончание является эксклюзивным. Другими словами, сравнение для БОЛЬШЕ ЧЕМ ИЛИ РАВНО ( > =) начало, но МЕНЬШЕ (<) конец. Этот подход обычно имеет наибольший смысл при работе с датой.

Ответ 4

Это поможет вам проверить, была ли ваша дата вчера.

public static final long ONE_MINUTE = 60 * 1000;
public static final long ONE_HOUR = 60 * ONE_MINUTE;
public static final long ONE_DAY = 24 * ONE_HOUR;

public static boolean isYesterday(Date d) {
    return DateUtils.isToday(d.getTime() + ONE_DAY);
} 

Ответ 5

Чтобы найти дельта между датами: Короче говоря,

long endL = end.getTimeInMillis() + end.getTimeZone().getOffset( end.getTimeInMillis() ); 
long startL = this.getTimeInMillis() + this.getTimeZone().getOffset(this.getTimeInMillis());
return (endL - startL) / MILLISECS_PER_DAY;

Подробно,

http://user.xmission.com/~goodhill/dates/deltaDates.html

Ответ 6

В вашей деятельности OnCreate

    //Get current date - yymmdd increases only
    SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd");
    Date now = new Date();
    int nowTime= Integer.parseInt(formatter.format(now));

    //Get last login date - stored in db
    int lastLogin= dbManager.getLastLoginDate();

    //Check if next day
    if(nowTime> lastLogin){

        //Do your stuff
        //Update last login date
        dbManager.saveLoginDate(nowTime);
    }