我在Java中使用compareTo方法尝试检查某个日期是否大于或等于另一个日期之后的24小时。
如何确定要比较日期的整数?
答案 0 :(得分:13)
使用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
答案 1 :(得分:7)
答案取决于您想要达到的目标。
一种方法,可以检查以毫秒为单位的差异。可以通过
计算24小时(毫秒)24 * 60 * 60 * 1000 = 86400000
h min sec millis
(在代码中,您也可以编写TimeUnit.HOURS.toMillis(24)
,其中IMO更具描述性)
现在你可以检查两个日期之间的差异(以毫秒表示)是否大于86400000。
答案 2 :(得分:5)
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)等异常现象,这些异常可以使一天更长或更短的时间。
所以我们可以在UTC工作。不需要时区。
如果您指的是java.util.Date
个对象,请先将它们转换为java.time对象。 Date
类是麻烦的旧日期时间类的一部分,以及Calendar
,现在是遗留的,被java.time类取代。
相当于java.util.Date
是java.time.Instant
。 Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。
您可以通过添加到旧类的新方法转换为java.time类型./ / p>
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
枚举来定义小时数。
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的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
更新:现在位于Joda-Time的maintenance mode项目建议迁移到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 );
如果您真的打算在第二天考虑相同的wall-clock time,请致电plusDays( 1 )
而不是plusHours( 24 )
。 Joda-Time然后调整夏令时(DST)或其他异常。例如,在美国,由于我们的1小时DST愚蠢,这可能意味着25小时而不是24小时。
如果真的要测试所讨论的日期时间是否在那个24小时的时间内,请使用Joda-Time的三个类之一的时间跨度:间隔,持续时间和周期。
Interval interval = new Interval( now, twentyFourHoursFromNow );
boolean isDateTimeInQuestionContainedWithinNext24Hours = interval.contains( dateTimeInQuestion );
对于那种比较,Joda-Time使用“半开”逻辑。这意味着开始日期时间包含,而结尾是独占。换句话说,比较大于或等于(> =)开始,但少于(<)结尾。在使用日期时,这种方法通常最有意义。
答案 3 :(得分:1)
这将帮助您检查您的日期是否是昨天
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);
}
答案 4 :(得分:0)
查找日期之间的差异:简而言之,
long endL = end.getTimeInMillis() + end.getTimeZone().getOffset( end.getTimeInMillis() );
long startL = this.getTimeInMillis() + this.getTimeZone().getOffset(this.getTimeInMillis());
return (endL - startL) / MILLISECS_PER_DAY;
详细说明,
答案 5 :(得分:0)
在您的活动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);
}