【问题标题】:How to check if time in day is between two times?如何检查一天中的时间是否在两次之间?
【发布时间】:2015-03-18 00:45:27
【问题描述】:

在我的应用程序中,我创建了一个代表高中班级的对象。该对象包含 2 个 Calendar 对象,它们代表每天班级的开始和停止时间。当用户创建作业时,我想检查当前时间是否在任何课程的两次之间。如果是,我知道作业是在那堂课上创建的。这是我当前不起作用的代码,因为 .getTime() 返回一个包含月份和日期的日期,而我只想比较小时和分钟。那么如何修剪返回的日期以仅包含一天中的时间?使用 joda-time 会更容易吗?如果可以,应该使用哪些类?

    public void checkTimeFrame() {
    time = Calendar.getInstance().getTime();
    ArrayList<SchoolClass> mList = mClassList;

    // Changes index if assignment falls under time frame of class
    for (int a = 0; a < mList.size(); a++) {
        if (mList.get(a).getStartTime() != null && mList.get(a).getEndTime() != null &&
                time.after(mList.get(a).getStartTime().getTime()) && time.before(mList.get(a)
                .getEndTime().getTime())) {
            index = a;
            updateClassEditText();
        }
    }
}

【问题讨论】:

    标签: java android time calendar jodatime


    【解决方案1】:

    JDK 8 日期时间 API 是解决这类问题的好方法。使用 LocalTime 代替 Calendar 来存储课程的开始和结束时间。

    LocalTime now = LocalTime.now(ZoneId.systemDefault());
    LocalTime start = mList.get(a).getStartTime();
    LocalTime end = mList.get(a).getEndTime();
    if(now.isAfter(start) && now.isBefore(end)){
        //do something
    }
    

    对于 Android,您可以使用 ThreeTenABP 项目,它为 Android 适配了 java.time API。

    【讨论】:

    • 谢谢!在使用 Calendar 等尝试了很多解决方案之后,大约需要 10-15 行代码并获得了大约 200 票并且对我不起作用,这很容易解决了我的问题,谢谢!
    • @Daria 很高兴知道我的回答有帮助。
    【解决方案2】:

    您可以使用Calendar.get(),如另一个答案中所述。不过,要比较分钟数,您也应该使用 Calendar.MINUTE

    int minutes_in_day = time.get(Calendar.HOUR_OF_DAY)*60 + time.get(Calendar.MINUTE);
    

    然后,您可以将当前时间当天的分钟数与开始和结束时间的分钟数进行比较。当然,这仅适用于同一天的时间。

    【讨论】:

    • 字段 HOUR_OF_DAY 是静态常量public static final int HOUR_OF_DAY 11
    【解决方案3】:

    Calendar 类有一个get 方法,您可以在其中get 不同的字段

    例如

    int hr = time.get(Calendar.HOUR_OF_DAY)
    

    【讨论】:

      【解决方案4】:

      我将在这里只提供您要求的与 Joda-Time 相关的答案。 Joda-Time 的优势在于为时钟时间提供专用类型,即LocalTime。旧的java.util.Calendar-stuff 不提供此优势,因此您遇到了困难。

      首先您转换java.util.Date 的实例,如下所示:

      Date time = ...;
      DateTime dt = new DateTime(time, DateTimeZone.getDefault());
      LocalTime lt = dt.toLocalTime();
      

      请注意,转换始终取决于时区。然后您可以使用继承的方法isAfter(...)isBefore(...) 比较两个LocalTime 实例。

      【讨论】:

        【解决方案5】:
            try {
                Date date1 = sdf.parse(given time);
                Date date2 = sdf.parse("08:00 AM");
                Date date3 = sdf.parse("06:00 PM");
        
                if((date1.after(date2))&&(date1.before(date3))||date1.equals(date2) ||date1.equals(date3) ) {
        
                } 
            } catch (ParseException e){
                e.printStackTrace();
            }
        

        【讨论】:

          猜你喜欢
          • 2017-11-22
          • 2022-01-20
          • 2015-06-16
          • 1970-01-01
          • 1970-01-01
          • 2013-04-01
          • 2013-06-13
          • 1970-01-01
          相关资源
          最近更新 更多