Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查一个日期是否正好是另一个日期之后的24小时或更长时间_Java_Date - Fatal编程技术网

Java 检查一个日期是否正好是另一个日期之后的24小时或更长时间

Java 检查一个日期是否正好是另一个日期之后的24小时或更长时间,java,date,Java,Date,我使用Java中的compareTo方法尝试检查某个日期是否大于或等于另一个日期后的24小时 如何确定要将日期与哪个整数进行比较?使用该类。如果您已经有一个日期对象,您仍然可以使用日历: Date aDate = . . . Calendar today = Calendar.getInstance(); today.setTime(aDate); Calendar tomorrow = Calendar.getInstance(); tomorrow.setTime(aDate); tomor

我使用Java中的compareTo方法尝试检查某个日期是否大于或等于另一个日期后的24小时

如何确定要将日期与哪个整数进行比较?

使用该类。如果您已经有一个
日期
对象,您仍然可以使用
日历

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

要查找日期之间的差值:简而言之

long endL = end.getTimeInMillis() + end.getTimeZone().getOffset( end.getTimeInMillis() ); 
long startL = this.getTimeInMillis() + this.getTimeZone().getOffset(this.getTimeInMillis());
return (endL - startL) / MILLISECS_PER_DAY;
具体地说,


答案取决于你想要达到的目标

一种方法是以毫秒为单位检查差异。24小时(毫秒)可通过以下方式计算:

24  *  60  *  60  *  1000   =  86400000
h      min    sec    millis  
(在代码中,您还可以编写
TimeUnit.HOURS.toMillis(24)
哪个IMO更具描述性)

所以现在您可以检查两个日期之间的差异(以毫秒为单位)是否大于86400000。

tl;博士 ……还有

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小时以上
你提到的方法不能做到这一点。它的设计目的仅仅是告诉你某个时刻是相同的,是晚一点,还是早一点。该方法不关心特定的时间跨度,例如24小时

你明确表示日期无关紧要。因此,您希望忽略一些异常情况,例如夏令时(DST),这些异常情况会使一天的时间变长或短于24小时

这样我们就可以工作了。不需要时区

如果您指的是
java.util.Date
对象,请首先将它们转换为java.time对象。
Date
类与
Calendar
一起是旧日期时间类的一部分,它们现在是遗留类,被java.time类取代

java.util.Date
的等价物是
java.time.Instant
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

您可以通过添加到旧类中的新方法来转换java.time类型

Instant start = myUtilDate_Start.toInstant();
Instant stop = myUtilDate_Stop.toInstant();
定义我们关心的间隙,在本例中为24小时,作为一个对象

使用该
持续时间
计算24小时后的值。通过枚举定义小时单位

最后,比较第二个日期时间值。打电话给我


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门针对Android采用了Three Ten Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和


乔达时间 更新:该项目现在处于运行状态,建议迁移到java.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 );
一天≠ 24小时

如果你真的打算考虑第二天的相同,请调用<代码> PulsDayes(1)< /C> >而不是<代码> PLUESREST(24)。然后根据夏令时(DST)或其他异常情况调整Joda时间。例如,在美国,这可能意味着25小时而不是24小时,因为我们的1小时DST愚蠢

在24小时内进行比较 如果真的要测试所讨论的日期时间是否在24小时的时间跨度内,请使用Joda time的三个时间跨度类之一:间隔、持续时间和周期

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

对于这种比较,Joda Time使用“半开放”逻辑。这意味着开始日期时间是包含的,而结束日期时间是独占的。换句话说,比较大于或等于(>=)开始,但小于(这将帮助您检查您的日期是否是昨天

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);
} 

在您的活动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);
    }

你能澄清一下吗?你是指24小时,一个日历日,还是指“相邻的24小时时段”?我不想检查是不是第二天,我想检查是24小时后还是更晚。你觉得GregoriaCalendar类怎么样?为什么我不能用compareTo方法比较日期?compareTo方法只告诉你一个日期是在另一个日期之前还是之后。它不告诉你如果存在差异。要查看
日期a
是否比
日期b
至少多24小时,您需要在
b
中添加24小时,然后您可以调用
compareTo
日历
对象更适合于此。只要记住使用
long
算法,而不是
int
。如果您如果你要用单位,请正确使用。现在,你的单位是t^5@DaftPunk你所说的不正确用法是什么意思?
86400000
int
范围内。而且将
long
int
进行比较应该不会有问题,比如
someLong1-someLong2>someInt
@pshemounits以DayshoursMinutesSecondsmills为单位。这将不考虑日光节约(这会导致某些天为23小时,其他天为25小时)。您提供使用日历并演示如何从日期转换为日历,但我如何检查一个日历是否在另一个日历之后?这一问题尚未解决。我需要检查日历是从今天开始还是从前一天开始,因此如果您能回答这一问题,它将
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 );
Interval interval = new Interval( now, twentyFourHoursFromNow );
boolean isDateTimeInQuestionContainedWithinNext24Hours = interval.contains( dateTimeInQuestion );
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);
} 
    //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);
    }