【问题标题】:How to know if now time is between two hours?如何知道现在时间是否在两个小时之间?
【发布时间】:2013-06-17 06:18:53
【问题描述】:

我现在有时间:

new Date();

我有一些小时常数,例如,238(晚上 11 点或 23:00、上午 8 点或 08:00)。 我怎么知道现在是两个小时常数之间的时间?

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

这里的图片可以更好地解释:

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

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!!

【问题讨论】:

  • 你试过了吗?
  • 我尝试了但没有。我和java中的时间函数混淆了,它真的有很多方法。
  • 您只想比较时间。所以Jan 1 00:00:00 GMT 2013Dec 31 00:00:00 GMT 2014 会在 2 小时之间,对吧?
  • 瞧!有答案stackoverflow.com/a/17212955/2235132可以证明!

标签: java android time format hour


【解决方案1】:

试试这个

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

【讨论】:

  • 看来您的代码运行良好。我想我会使用它。只有你不知道几小时乘以一百?
  • 只是为了比较简单,否则要分别比较小时和分钟
  • 谢谢.. 它帮助了我
【解决方案2】:
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
}

【讨论】:

  • 我认为必须替换为:if(hour &lt;=23 &amp;&amp; hour &gt;=8) { // do what I need }。如果第一个小时是 01:00,则它不工作。
  • 我认为如果我写的是正确的。我认为他们希望程序在晚上运行。
  • 对不起,我有点不明白你在说什么
  • 就是这么简单。只需获取日历,然后从日历中获取小时。然后检查时间是否在晚上 23:00 之后和早上 8:00 之前
  • 你必须特别关心0:00。例如。如果 hourfrom == 0 那么 hourfrom = 24
【解决方案3】:

java.time

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

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

ZoneId z = ZoneId.of( "America/Montreal" );

获取您当前的时刻。

ZonedDateTime zdt = ZonedDateTime.now( z );

提取时间。名称中的Local 部分表示对象中没有时区的概念。

LocalTime lt = zdt.toLocalTime();

定义晚上的界限。

LocalTime start = LocalTime.of( 23 , 0 );  // 11 PM.
LocalTime stop = LocalTime.of( 8 , 0 );  // 8 AM.

比较。

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

  • 在日期时间工作中,我们通常将时间跨度定义为半开,其中开始是包含,而结束是独占。 p>

这是一种方法。

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.
}

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?


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

乔达时间

Joda-Time 库在日期时间工作方面远远优于 java.util.Date 和 .Calendar 类。

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

通常最好将时间范围定义为半开,[),其中开头包含但结尾不包含。

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

【讨论】:

    【解决方案4】:

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

            /**
             * @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);
            }
    

    【讨论】:

    • 谢谢!它比这里提供的任何其他解决方案都好得多!
    【解决方案5】:

    你可以看到一个教程hereDate.before 你可以用Date.after

    你也可以得到他的毫秒数并进行比较。

    【讨论】:

      【解决方案6】:

      这是一个检查现在(当前时间)是否介于两者之间的函数 1 到 4 或 4 到 8 或 8 至 12 或 12 至 16 或 16 至 20 或 20 比 1 并返回下一个计算时间。

      private Calendar GetTimeDiff() throws ParseException {
          Calendar now = Calendar.getInstance();
      
          Calendar one = Calendar.getInstance();
          one.set(Calendar.HOUR_OF_DAY, 1);
          one.set(Calendar.MINUTE, 0);
          one.set(Calendar.SECOND, 0);
      
          Calendar four = Calendar.getInstance();
          four.set(Calendar.HOUR_OF_DAY, 4);
          four.set(Calendar.MINUTE, 0);
          four.set(Calendar.SECOND, 0);
      
          Calendar eight = Calendar.getInstance();
          eight.set(Calendar.HOUR_OF_DAY, 8);
          eight.set(Calendar.MINUTE, 0);
          eight.set(Calendar.SECOND, 0);
      
          Calendar twelve = Calendar.getInstance();
          twelve.set(Calendar.HOUR_OF_DAY, 12);
          twelve.set(Calendar.MINUTE, 0);
          twelve.set(Calendar.SECOND, 0);
      
          Calendar sixteen = Calendar.getInstance();
          sixteen.set(Calendar.HOUR_OF_DAY, 16);
          sixteen.set(Calendar.MINUTE, 0);
          sixteen.set(Calendar.SECOND, 0);
      
          Calendar twenty = Calendar.getInstance();
          twenty.set(Calendar.HOUR_OF_DAY, 20);
          twenty.set(Calendar.MINUTE, 0);
          twenty.set(Calendar.SECOND, 0);
      
          if(now.getTime().after(one.getTime()) && now.getTime().before(four.getTime())) {
              return four;
          }
      
          if(now.getTime().after(four.getTime()) && now.getTime().before(eight.getTime())) {
              return eight;
          } 
      
          if(now.getTime().after(eight.getTime()) && now.getTime().before(twelve.getTime())) {
              return twelve;
          } 
      
          if(now.getTime().after(twelve.getTime()) && now.getTime().before(sixteen.getTime())) {
              return sixteen;
          } 
      
          if(now.getTime().after(sixteen.getTime()) && now.getTime().before(twenty.getTime())) {
              return twenty;
          } 
      
          if(now.getTime().after(twenty.getTime()) && now.getTime().before(one.getTime())) {
              return one;
          }
      
          return now;
      }
      

      【讨论】:

        【解决方案7】:

        PHP 解决方案

        我无法在 PHP 中找到解决方案,但 @sytolk 的回答有所帮助。这是 PHP 版本。

        // $current = Date('H:i:s');
        $current = "01:00:00";
        $start = "23:00:00";
        $end = "02:00:00";
        
        $current = DateTime::createFromFormat('H:i:s', $current);
        $start = DateTime::createFromFormat('H:i:s', $start);
        $end = DateTime::createFromFormat('H:i:s', $end);
        
        if ($end < $start) {
            if ($current > $end) {
                $end->modify('+1 day');
            } else {
                $start->modify('-1 day');
            }
        }
        
        $inTime = $current > $start && $current < $end;
        

        【讨论】:

          【解决方案8】:

          您还可以将输入字符串转换为整数并将其与常量进行比较。这样,您甚至不需要使用 Calendar 和 Date 对象。

          public class testDateRange {
          
              static final int START_HOUR = 8;
              static final int END_HOUR = 23;
          
              public static void main(String[] args) {
                  String now_time = new SimpleDateFormat("HH:mm").format(new Date());
                  System.err.println(isInRange(Integer.parseInt(now_time.replace(":","")),START_HOUR*100,END_HOUR*100));
          
              }
          
              private static boolean isInRange(int now_time, int start_time, int end_time) {
          
                 if ((now_time>start_time)&&
                         (now_time<end_time)       )
                 {
                  return true;
                 }
                  return false;
              }
          
          }
          

          【讨论】:

          • 如果 START_HOUR = 23 和 END_HOUR = 23,我们可以使用此代码吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-19
          • 1970-01-01
          • 2022-01-20
          • 2017-11-22
          • 1970-01-01
          • 2020-11-03
          相关资源
          最近更新 更多