比较Java中的时间和次数操作

时间:2011-01-27 21:02:25

标签: java time

您好 如果是早上,中午,下午,晚上,我想创建具有不同行为的应用程序。 现在我想为每个变量设置一些变量 例如中午= 12:00 现在我想比较他们的当前时间,看看它是否是早上的例子,并计算多少到中午12点 - 当前时间。 现在我已经看到了几个具有不同日期的示例,但我想仅按小时进行比较。

4 个答案:

答案 0 :(得分:2)

您可以使用joda time hoursBetween,也可以使用Java日历类。我建议使用JodaTime。

  • 使用Java Calendar类:

        Calendar future = Calendar.getInstance(); //future time
        future.set(Calendar.YEAR, 2011);
        future.set(Calendar.MONTH, 0);
        future.set(Calendar.DATE,27);
        future.set(Calendar.HOUR_OF_DAY,17);
        //get current time
        Calendar now = Calendar.getInstance();
        //time difference between now and future in hours
        long hoursDiff = (future.getTimeInMillis() - now.getTimeInMillis())/(60 * 60 * 1000);
        System.out.println("Difference in hours is ="+hoursDiff);//prints 2 since it's 3 pm here 
    

这不会影响日光量,并与您的LOCAL时区进行比较。

  • 使用Joda Time houret:

    DateTime futureDate = new DateTime(future.getTime());
    DateTime current = new DateTime(now.getTime());
    int difference = Hours.hoursBetween(current,futureDate).getHours();
    System.out.println("Difference in hours is ="+difference);
    

另请参阅此question和此question

答案 1 :(得分:2)

    Calendar cal=GregorianCalendar.getInstance();

    int hour = cal.get(Calendar.HOUR);

然后比较小时。

这适用于您当地的时区

答案 2 :(得分:2)

TL;博士

if ( 
    LocalTime.now( ZoneId.of( "Africa/Tunis” ) )
             .isBefore( LocalTime.of( 12 , 0 ) )
) {
    … // Do morning stuff. 
}

java.time

其他答案是正确的,但使用过时的课程。 java.util.Date / .Calendar类已被Java 8及更高版本中内置的java.time框架取代。

LocalTime类代表没有日期且没有时区的时间。

为你定义"早晨","下午"等等制定一些常量。在实际工作中,我会使用枚举。但我会在这里使用一个简单的变量进行演示。

LocalTime noon = LocalTime.of( 12 , 0 );

时区对于解释时间至关重要。一个时间只在特定时区的背景下具有意义。如果未指定,则将自动以静默方式应用JVM的当前默认时区。我强烈建议您始终明确指定所需/预期的时区。您可以将ZonedDateTime视为Instant加上时区(ZoneId)的组合。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );

我们可以根据指定的时区从LocalTime中提取ZonedDateTime

LocalTime nowLocalTime = now.toLocalTime();

与目标时间比较。

Boolean isMorning = nowLocalTime.isBefore( noon );

使用Duration类将时间跨度表示为总秒数加上几分之一秒(纳秒)。

ZonedDateTime todayNoon = now.adjustInto( noon );
Duration untilNoon = Duration.between( now , todayNoon );

Duration::toString的默认输出是由ISO 8601定义的格式的字符串。示例PT38M2S三十八分二秒。您也可以询问分钟数等。

通过从ZonedDateTime个对象获取持续时间,我们将获得准确的结果,以解决夏令时(DST)等异常情况。如果您希望使用通用的24小时工作日计算,请将LocalTime个对象传递给Duration.between

答案 3 :(得分:0)

您可以使用GregorianCalendar来执行此操作。创建一个新的GregorianCalendar并将月,日和年设置为某个常量值。将小时设置为您感兴趣的任何时间,即中午12:00。现在只需getTimeInMillis()并存储该值。稍后,您可以使用no-arg版本创建另一个GregorianCalendar以获取当前时间。将月,日和年设置为与基准值相同的常量值,然后再次比较getTimeInMillis()以查看它是否在参考时间之前,等于或之后。