如何知道现在时间是否在两个小时之间?

Tra*_*cer 17 java format time android hour

我现在有时间:

new Date();
Run Code Online (Sandbox Code Playgroud)

我有一些小时常数,例如23和8(现在是晚上11点或23点,早上8点或08点).我怎么知道现在是两小时常数之间的时间?

它需要运行一些程序代码或不运行,如果现在时间介于两个小时之间,例如,如果它已经是晚上并且不是早晨,则不运行某些代码.

这里的图像更好地解释:

在此输入图像描述

某些情况下静音模式不会触发:

00:00 20.06.13 - 23:00 20.06.13 // after 23.00 can loud!!

23:00 20.06.13 - 15:00 20.06.13 // after 15.00 can loud!!

01:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!

21:00 20.06.13 - 08:00 20.06.13 // after 08.00 can loud!!
Run Code Online (Sandbox Code Playgroud)

Evg*_*eev 29

试试这个

    int from = 2300;
    int to = 800;
    Date date = new Date();
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    int t = c.get(Calendar.HOUR_OF_DAY) * 100 + c.get(Calendar.MINUTE);
    boolean isBetween = to > from && t >= from && t <= to || to < from && (t >= from || t <= to);
Run Code Online (Sandbox Code Playgroud)


Hol*_*ger 11

Calendar cal = Calendar.getInstance(); //Create Calendar-Object
cal.setTime(new Date());               //Set the Calendar to now
int hour = cal.get(Calendar.HOUR_OF_DAY); //Get the hour from the calendar
if(hour <= 23 && hour >= 8)              // Check if hour is between 8 am and 11pm
{
     // do whatever you want
}
Run Code Online (Sandbox Code Playgroud)


syt*_*olk 7

我认为这是更清洁的解决方案,并且有效。我已经用不同的时间参数对其进行了测试。

        /**
         * @param fromHour Start Time
         * @param toHour Stop Time
         * @param now Current Time
         * @return true if Current Time is between fromHour and toHour
         */
        boolean isTimeBetweenTwoHours(int fromHour, int toHour, Calendar now) {
            //Start Time
            Calendar from = Calendar.getInstance();
            from.set(Calendar.HOUR_OF_DAY, fromHour);
            from.set(Calendar.MINUTE, 0);
            //Stop Time
            Calendar to = Calendar.getInstance();
            to.set(Calendar.HOUR_OF_DAY, toHour);
            to.set(Calendar.MINUTE, 0);

            if(to.before(from)) {
                if (now.after(to)) to.add(Calendar.DATE, 1);
                else from.add(Calendar.DATE, -1);
            }
            return now.after(from) && now.before(to);
        }
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

java.time

现代的方法是使用Java 8及更高版本中内置的java.time类。许多功能已在ThreeTen-Backport项目中反向移植到Java 6和7,并在ThreeTenABP项目中进一步适应了Android。

时区在这里至关重要。对于任何给定的时刻,日期和时间在世界各地都可能因区域而异。

ZoneId z = ZoneId.of( "America/Montreal" );
Run Code Online (Sandbox Code Playgroud)

得到你的当前时刻。

ZonedDateTime zdt = ZonedDateTime.now( z );
Run Code Online (Sandbox Code Playgroud)

提取时间。Local名称的一部分意味着对象中不包含时区的概念。

LocalTime lt = zdt.toLocalTime();
Run Code Online (Sandbox Code Playgroud)

定义晚上的界限。

LocalTime start = LocalTime.of( 23 , 0 );  // 11 PM.
LocalTime stop = LocalTime.of( 8 , 0 );  // 8 AM.
Run Code Online (Sandbox Code Playgroud)

比较。

  • 我们需要弄清楚我们是跨越新的一天还是同一天。A LocalTime没有日期概念,只有一个24小时的通用日期。因此,我们必须测试开始是在停止之前还是之后,因为每种情况我们需要不同的比较算法。我们应该考虑起点是否等于起点,因为这可能是一种特殊情况,具体取决于您的业务规则。

  • 在日期时间工作中,我们通常将时间跨度定义为Half-Open,其中开始是包含在内的,而结尾是排斥的。

这是一种方法。

Boolean silentRunning = null ;
if( start.equals( stop ) ) {
    silentRunning = Boolean.FALSE ;
} else if( stop.isAfter( start ) ) {  // Example 3 PM to 6 PM.
    silentRunning = ( ! lt.isBefore( start ) ) && lt.isBefore( stop ) ;
} else if ( stop.isBefore( start ) ) {  // Example 11 PM to 8 AM.
    silentRunning = ( lt.equals( start ) || lt.isAfter( start ) ) && lt.isBefore( stop ) ;
} else {
    // Error. Should not reach this point. Paranoid check.
}
Run Code Online (Sandbox Code Playgroud)

关于java.time

该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat。

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。

在哪里获取java.time类?


更新:上面是此答案的更高版本。下面是旧的。

乔达时代

对于日期时间工作,Joda-Time库大大优于java.util.Date和.Calendar类。

时区对于确定一天中的时间至关重要。显然,“现在”在巴黎要晚于蒙特利尔。

Definig通常将时间范围最好设置为半开放式,[)即开始为包容性,而结束为排他性。

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zone );
Integer hour = now.getHourOfDay();
Boolean isNight = ( ( hour >= 23  ) && ( hour < 8 ) );
Run Code Online (Sandbox Code Playgroud)