【问题标题】:Compare 2 Dates only by Hour and Minute in Java?在 Java 中仅按小时和分钟比较 2 个日期?
【发布时间】:2017-03-02 16:30:52
【问题描述】:

我正在尝试比较 2 天(实际上是 3 天)。在我的用例中,我需要比较 3 个日期。一个是 StartSleepingTime、StopSleepingTime 和 Now。我的应用程序监视用户的活动级别,并且我有一个每半小时运行一次的计划任务,以检查 NOW 是否在用户的 StartSleepingTime 和 StopSleepingTime 之间,以确保在此间隔期间停止活动监控服务。由于用户在我运行计划任务时首次登录时设置了 StartSleepingTime 和 StopSleepingTime,因此与现在相比,两者都将处于“过去”状态。目前我正在尝试仅从 3 个日期中提取小时和分钟信息并进行如下比较:

public static boolean compareHrsAndMintsOnly(Date startSH, Date now, Date stopSH) {
    boolean isNowWithinSleepingTime = false;

    Calendar startSHCalendar = Calendar.getInstance();
    startSHCalendar.setTime(startSH);
    Calendar nowCalendar = Calendar.getInstance();
    nowCalendar.setTime(now);
    Calendar stopSHCalendar = Calendar.getInstance();
    stopSHCalendar.setTime(stopSH);

    int startSHhour = startSHCalendar.get(Calendar.HOUR_OF_DAY);
    int startSHmin = startSHCalendar.get(Calendar.MINUTE);

    int nowHour = nowCalendar.get(Calendar.HOUR_OF_DAY);
    int nowMin = nowCalendar.get(Calendar.MINUTE);

    int stopSHhour = stopSHCalendar.get(Calendar.HOUR_OF_DAY);
    int stopSHmin = stopSHCalendar.get(Calendar.MINUTE);

    if ((startSHhour > nowHour && startSHmin > nowMin) && (nowHour < stopSHhour && nowMin < stopSHmin)) {
        // stop the monitoring service
        isNowWithinSleepingTime = true;
    }else {
       // start the monitoring service

        isNowWithinSleepingTime = false;
    }

    return isNowWithinSleepingTime;

}

但这由于某种原因不起作用。另外,我觉得必须有更好的方法来实现比较。请有任何建议!

【问题讨论】:

    标签: java android date calendar


    【解决方案1】:

    我使用 joda-time 来处理日期。所以我会有类似的东西:

    package org.devmaster.sample;
    
    import org.joda.time.DateTime;
    import org.joda.time.Interval;
    
    import java.util.Calendar;
    import java.util.Date;
    
    public final class Util {
    
        public static boolean compareHrsAndMintsOnly(Date startSH, Date now, Date stopSH) {
            DateTime start = toDateTime(startSH);
            DateTime end = toDateTime(stopSH);
    
            Interval interval = new Interval(start, end);
    
            DateTime instant = toDateTime(now);
    
            // now is between startSH and stopSH
            return interval.contains(instant);
        }
    
        private static DateTime toDateTime(Date date) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            return new DateTime(
                    c.get(Calendar.YEAR),
                    c.get(Calendar.MONTH),
                    c.get(Calendar.DAY_OF_MONTH),
                    c.get(Calendar.HOUR_OF_DAY),
                    c.get(Calendar.MINUTE));
        }
    
    }
    

    编辑

    如果你想玩,我做了一个示例:https://github.com/betorcs/jodatime-sample

    【讨论】:

    • 感谢您的建议。我现在将测试它是否有效。看起来非常简单易懂! :)
    • 我接受了您的回答,因为它是最容易实现且可靠的(经证明很好的库)。再次感谢!
    • 刚刚测试过了。当 startSH 和 stopSH 过去时,它不起作用:/
    • 我想我没有得到你需要的东西,对不起,如果我的例子没有完全针对你需要的东西。我的意图是给你一个北方,让你解决你的需要!
    • 别担心!在我的情况下,用户将只设置一次他们的睡眠时间(例如开始和停止)。他们可能看起来像这样:StartSH Fri Mar 02 20:00:00 和 StopSH Fri Mar 02 08:00:00(3 月 2 日是他们设置睡眠时间的日期)。问题在 Fri Mar 02 过去后开始(例如,它是 Sat Mar 03 等等)。我不确定如何将过去的日期与现在进行比较。谢谢你的github链接:)
    【解决方案2】:

    试试这个:

        Calendar startSHCalendar = Calendar.getInstance();
        startSHCalendar.setTime(startSH);
        Calendar nowCalendar = Calendar.getInstance();
        nowCalendar.setTime(now);
        Calendar stopSHCalendar = Calendar.getInstance();
        stopSHCalendar.setTime(stopSH);
    
        int startSHhour = startSHCalendar.get(Calendar.HOUR_OF_DAY);
        int startSHmin = startSHCalendar.get(Calendar.MINUTE);
        int timeStart = startSHhour*60 + startSHmin;  //this
    
        int nowHour = nowCalendar.get(Calendar.HOUR_OF_DAY);
        int nowMin = nowCalendar.get(Calendar.MINUTE);
        int timeNow = nowHour*60 + nowMin;  //this
    
        int stopSHhour = stopSHCalendar.get(Calendar.HOUR_OF_DAY);
        int stopSHmin = stopSHCalendar.get(Calendar.MINUTE);
        int timeStop = stopSHhour*60 + stopSHmin;  //this
    
        if( timeStart <= timeNow  && timeNow <= timeStop ){
            //between
        }else{
            //not betwwen
        }
    

    /!\警告,如果你在两天之间,你也必须与天比较

    希望对你有帮助

    【讨论】:

    • 感谢您的建议!它似乎在我的测试期间工作!真的很感激!
    【解决方案3】:

    保持简单:

    if(nowHour == stopSHhour && nowMin == stopSHmin){ 
        // do something...
    
    }
    

    【讨论】:

    • 感谢您的建议。但是,此检查将失败,因为我每半小时检查一次。例如,检查可能发生在 8:15,startSleeping 时间可能是 8:00。它必须是 > 或
    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多