Я использую метод compareTo в Java, чтобы попытаться проверить, превышает ли определенную дату или равно 24 часам после другой даты.
Как определить, какое целое число должно сравнивать дату?
Я использую метод compareTo в Java, чтобы попытаться проверить, превышает ли определенную дату или равно 24 часам после другой даты.
Как определить, какое целое число должно сравнивать дату?
Ответ зависит от того, чего вы хотите достичь.
В одном случае можно было бы проверить разницу в миллисекундах. 24 часа в миллисекундах можно вычислить через
24 * 60 * 60 * 1000 = 86400000
h min sec millis
(в коде вы также можете написать TimeUnit.HOURS.toMillis(24)
, который ИМО более описателен)
Итак, теперь вы можете просто проверить, больше ли разница между двумя датами (выраженная в миллисекундах), чем 86400000.
Используйте класс 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
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.
Вы специально попросили сравнить два периода времени, чтобы спросить, есть ли:
Метод 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 8 и более поздние версии. Эти классы вытесняют неприятный старый legacy классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советует перейти на java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и больше.
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 );
Если вы действительно хотели рассмотреть тот же время настенных часов следующего дня, вызовите plusDays( 1 )
, а не plusHours( 24 )
. Затем Joda-Time настраивается на летнее время (DST) или другие аномалии. Например, здесь, в Соединенных Штатах, это может означать 25 часов, а не 24 часа из-за нашей 1-часовой глупости DST.
Если вы действительно хотите проверить, подходит ли указанное время в течение этого 24-часового промежутка времени, используйте один из трех классов Joda-Time для промежутков времени: интервал, продолжительность и период.
Interval interval = new Interval( now, twentyFourHoursFromNow );
boolean isDateTimeInQuestionContainedWithinNext24Hours = interval.contains( dateTimeInQuestion );
Для такого сравнения Joda-Time использует логику "Half-Open". Это означает, что начальная дата-время включена, в то время как окончание является эксклюзивным. Другими словами, сравнение для БОЛЬШЕ ЧЕМ ИЛИ РАВНО ( > =) начало, но МЕНЬШЕ (<) конец. Этот подход обычно имеет наибольший смысл при работе с датой.
Это поможет вам проверить, была ли ваша дата вчера.
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);
}
Чтобы найти дельта между датами: Короче говоря,
long endL = end.getTimeInMillis() + end.getTimeZone().getOffset( end.getTimeInMillis() );
long startL = this.getTimeInMillis() + this.getTimeZone().getOffset(this.getTimeInMillis());
return (endL - startL) / MILLISECS_PER_DAY;
Подробно,
В вашей деятельности 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);
}