【问题标题】:Check if time is inbetween timerange in Android检查时间是否在Android的时间范围之间
【发布时间】:2014-01-28 17:44:31
【问题描述】:

我正在尝试检查当前时间是否在指定范围内。我做了一个方法来检查这个,但它不起作用。我不确定为什么不以及如何让它工作。

private Calendar fromTime;
private Calendar toTime;
private Calendar currentTime;

public boolean checkTime(String time) {
    try {
        String[] times = time.split("-");
        String[] from = times[0].split(":");
        String[] until = times[1].split(":");

        fromTime = Calendar.getInstance();
        fromTime.set(Calendar.HOUR, Integer.valueOf(from[0]));
        fromTime.set(Calendar.MINUTE, Integer.valueOf(from[1]));

        toTime= Calendar.getInstance();
        toTime.set(Calendar.HOUR, Integer.valueOf(until[0]));
        toTime.set(Calendar.MINUTE, Integer.valueOf(until[1]));

        currentTime = Calendar.getInstance();       
        currentTime.set(Calendar.HOUR, Calendar.HOUR_OF_DAY);
        currentTime.set(Calendar.MINUTE, Calendar.MINUTE);
        if(currentTime.after(fromTime) && currentTime.before(toTime)){
            return true;
        }
     } catch (Exception e) {
         return false;
     }
    return false;
}

我正在尝试这样测试:

if(checkTime("06:00-19:00")){
    inRange = true;
}

NPE 消失了,但它仍然没有计算时间是否在fromTimetoTime 的范围内。非常感谢任何帮助!

【问题讨论】:

  • 你在任何地方定义fromTime和toTime吗?
  • currentTime.set(Calendar.MINUTE, Calendar.MINUTE);currentTime.set(Calendar.HOUR, Calendar.HOUR_OF_DAY); 不符合您的预期。最好阅读documentation
  • 是的,对不起!检查我的编辑!
  • 为什么使用字段而不是局部变量?顺便说一句:发生 NPE 是因为您从未初始化 toTimecurrentTime
  • 你不能使用 toTime.set() 你必须先初始化它。所以更好的地方 toTime = Calendar.getInstance();在调用 set() 之前,同样适用于 currentTime = Calendar.getInstance();

标签: java android time range


【解决方案1】:

初始化变量并将方法的返回类型更改为布尔值。

private Calendar fromTime;
private Calendar toTime;
private Calendar currentTime;

public boolean checkTime(String time) {
try {
    String[] times = time.split("-");
    String[] from = times[0].split(":");
    String[] until = times[1].split(":");

    fromTime = Calendar.getInstance();
    fromTime.set(Calendar.HOUR_OF_DAY, Integer.valueOf(from[0]));
    fromTime.set(Calendar.MINUTE, Integer.valueOf(from[1]));

    toTime = Calendar.getInstance();
    toTime.set(Calendar.HOUR_OF_DAY, Integer.valueOf(until[0]));
    toTime.set(Calendar.MINUTE, Integer.valueOf(until[1]));

    currentTime = Calendar.getInstance();
    currentTime.set(Calendar.HOUR_OF_DAY, Calendar.HOUR_OF_DAY);
    currentTime.set(Calendar.MINUTE, Calendar.MINUTE);
    if(currentTime.after(fromTime) && currentTime.before(toTime)){
        return true;
    }
    } catch (Exception e) {
        return false;
    }
    return false;
}

【讨论】:

  • 糟糕,在这里发布之前忘记更改了!
  • 我推荐使用 Calendar.HOUR_OF_DAY 而不是 alendar.HOUR
  • 感谢您的输入,现在将对其进行测试,因为它仍会返回 true,而实际上并没有。
  • 感谢您的帮助!误读了你的答案,对不起我的困惑:)
  • 伙计们只是不要设置当前时间的小时和分钟。届时您将能够获得正确的信息。
【解决方案2】:

在使用 toTime 和 fromTime 对象之前,您还没有初始化它们。所以最好调用 toTime = Calendar.getInstance();之前。

private Calendar fromTime;
private Calendar toTime;
private Calendar currentTime;

public boolean checkTime(String time) {
try {
    String[] times = time.split("-");
    String[] from = times[0].split(":");
    String[] until = times[1].split(":");

    fromTime = Calendar.getInstance();
    fromTime.set(Calendar.HOUR, Integer.valueOf(from[0]));
    fromTime.set(Calendar.MINUTE, Integer.valueOf(from[1]));

    toTime = Calendar.getInstance();
    toTime.set(Calendar.HOUR, Integer.valueOf(until[0]));
    toTime.set(Calendar.MINUTE, Integer.valueOf(until[1]));

    currentTime = Calendar.getInstance();
    currentTime.set(Calendar.HOUR, Calendar.HOUR_OF_DAY);
    currentTime.set(Calendar.MINUTE, Calendar.MINUTE);
    if(currentTime.after(fromTime) && currentTime.before(toTime)){
        return true;
    }
    } catch (Exception e) {
        return false;
    }
    return false;
}

【讨论】:

  • 感谢您的意见,我不再收到任何 NPE。所以这是一个障碍。它仍然返回时间06:00-19:00 在范围内,而实际上不在范围内。我试过这样设置时区:currentTime = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"));
【解决方案3】:

这个

    currentTime.set(Calendar.HOUR, Calendar.HOUR_OF_DAY);
    currentTime.set(Calendar.MINUTE, Calendar.MINUTE);

不做你想做的事。它所做的是将字段 HOUR 设置为 Calendar.HOUR 的值,这是一个任意常量。

您不需要这两行,因为 getInstance 在当前时间返回日历。

【讨论】:

  • 感谢您的输入,删除了这些行并且不再有 NPE,但是比较还没有起作用。知道为什么不?
  • 是的。当您应该使用 HOUR_OF_DAY 字段时,您正在使用 HOUR 字段。
【解决方案4】:

SimpleDateFormat 格式 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

    Calendar cal = Calendar.getInstance();
    Calendar cal2 = Calendar.getInstance();



    //cal.add(Calendar.DATE, 1);
    String date = sdf.format(cal.getTime());
    String dateStart = date+" "+"11:30:00";

    String date2 = sdf.format(cal2.getTime());
    String dateStop =  date2+" "+"23:00:00";

    Calendar calendar = Calendar.getInstance();
    String currentTime =  format.format(calendar.getTime());



    Date d1 = null;
    Date d2 = null;
    Date d3 = null;


    try {
        d1 = format.parse(dateStart);

    d2 = format.parse(dateStop);
        d3 = format.parse(currentTime);
       // Toast.makeText(getApplicationContext(),""+dateCal,Toast.LENGTH_SHORT).show();
        if (d3.before(d2)
                && d3.after(d1) ){}else{} } catch (ParseException e) {
        e.printStackTrace();
    }

【讨论】:

    【解决方案5】:

    currentTime 放在 setTime 之外并从 setTime 中删除 if-statement . 如果您需要将 if-statement 放在 setTime 之外。

    【讨论】:

      【解决方案6】:
       private boolean checkBedTime(String time) {
          // Time Pattern Like : "06:00-19:00"
          String[] times = time.split("-");
          String[] from = times[0].split(":");
          String[] until = times[1].split(":");
      
          int fromHour = Integer.parseInt(from[0]);
          int fromMinute = Integer.parseInt(from[1]);
      
          int toHour = Integer.parseInt(until[0]);
          int toMinute = Integer.parseInt(until[1]);
      
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(System.currentTimeMillis());
          int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
          int currentMinute = calendar.get(Calendar.MINUTE);
      
          int convertedFromMinute = (fromHour * 60) + fromMinute;
          int convertedToMinute = (toHour * 60) + toMinute;
          int convertedCurrentMinute = (currentHour * 60) + currentMinute;
      
      
          if (convertedFromMinute == convertedToMinute) {
              Toast.makeText(context, "Sleep Time & Wake Up Time can't be same", Toast.LENGTH_SHORT).show();
              return false;
      
          } else if (convertedToMinute < convertedFromMinute) {
              convertedToMinute = convertedToMinute + (24 * 60);
          }
          Log.v("Time", "FromMinute --> " + convertedFromMinute);
          Log.v("Time", "ToMinute --> " + convertedToMinute);
          Log.v("Time", "CurrentMinute -- > " + convertedCurrentMinute);
          if (convertedCurrentMinute >= convertedFromMinute && convertedCurrentMinute <= convertedToMinute) {
              return true;
          } else {
              return false;
          }
      
      
      }
      

      【讨论】:

      • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      相关资源
      最近更新 更多