【问题标题】:Determine if a time is between two times regardless of date无论日期如何,确定时间是否在两次之间
【发布时间】:2017-11-29 16:52:13
【问题描述】:

我为我的 Android Wear 表盘创建了一个自定义 TimePicker 首选项。用户选择一个时间,它以毫秒为单位返回当前时间。这个代码可以在我的GitHub repo 上找到。

我不认为我在那堂课上所做的有什么问题——但也许我是。无论如何,然后我会像这样读取值:

final long nightModeStartTimeMillis = prefs.getLong("settings_night_mode_start_time",
                    Long.valueOf(getString(R.string.settings_night_mode_default_start_time)));
final long nightModeEndTimeMillis = prefs.getLong("settings_night_mode_end_time",
                    Long.valueOf(getString(R.string.settings_night_mode_default_end_time)));

我的问题是我想使用这些时间来确定当前时间是否在它们之间。但是,我不太清楚如何处理日期。我的defaultValue 开始时间TimePreference1483318830000(2017 年 1 月 1 日星期日 20:00:30 EST)。 I've been trying the code found from this answer,但在比较时,我想我永远不会让当前时间介于默认值之间,因为毫秒的日期永远不会改变——只有小时和分钟。

This is my current attempt--which doesn't work

有没有比我做的更简单的解决方法?对这一切有点困惑。

【问题讨论】:

  • 参考stackoverflow.com/questions/9816459/… 了解如何从时间戳中去除日期部分。一种方式:使用日期格式“HH:mm:ss.SSS”
  • 我不清楚。 getString(R.string.settings_night_mode_default_end_time)nightModeEndTimeMillis 的值是多少?你能提供一些输入和预期输出的例子吗?
  • 这是一个时间选择器。用户选择一个时间,我得到他们选择的时间的毫秒数。他们从不改变一天的日期——只改变小时和分钟。 R.string.settings_night_mode_default_end_time 只是我以毫秒为单位的默认开始时间,1483318830000

标签: java android datetime epoch


【解决方案1】:

给这个函数提供两次就得到了

TRUE如果当前时间在两次之间

FALSE 如果当前时间不在提供的两次之间

boolean checkIfCurrentTimeInBetweenRegardlessOfDate(long timeOne, long timeTwo) {

    Calendar calendarOne = Calendar.getInstance();
    calendarOne.setTimeInMillis(timeOne);
    Calendar calendarTwo = Calendar.getInstance();
    calendarTwo.setTimeInMillis(timeTwo);

    Calendar calendarCurrentTime = Calendar.getInstance();
    calendarCurrentTime.set(Calendar.HOUR_OF_DAY, 22);

    Calendar calendarOneToCompare = Calendar.getInstance();
    calendarOneToCompare.setTimeInMillis(calendarCurrentTime.getTimeInMillis());
    calendarOneToCompare.set(Calendar.HOUR_OF_DAY, calendarOne.get(Calendar.HOUR_OF_DAY));
    calendarOneToCompare.set(Calendar.MINUTE, calendarOne.get(Calendar.MINUTE));
    calendarOneToCompare.set(Calendar.SECOND, calendarOne.get(Calendar.SECOND));
    calendarOneToCompare.set(Calendar.MILLISECOND, calendarOne.get(Calendar.MILLISECOND));

    Calendar calendarTwoToCompare = Calendar.getInstance();
    calendarTwoToCompare.setTimeInMillis(calendarCurrentTime.getTimeInMillis());
    calendarTwoToCompare.set(Calendar.HOUR_OF_DAY, calendarTwo.get(Calendar.HOUR_OF_DAY));
    calendarTwoToCompare.set(Calendar.MINUTE, calendarTwo.get(Calendar.MINUTE));
    calendarTwoToCompare.set(Calendar.SECOND, calendarTwo.get(Calendar.SECOND));
    calendarTwoToCompare.set(Calendar.MILLISECOND, calendarTwo.get(Calendar.MILLISECOND));

    int AM_CALENDAR = Calendar.AM;
    int PM_CALENDAR = Calendar.PM;

    if (Integer.parseInt(String.valueOf(calendarOne.get(Calendar.AM_PM))) == PM_CALENDAR
            && Integer.parseInt(String.valueOf(calendarTwo.get(Calendar.AM_PM))) == AM_CALENDAR) {
        calendarTwoToCompare.add(Calendar.DATE, 1);
    }

    return (calendarOneToCompare.compareTo(calendarCurrentTime) < 0
            && calendarCurrentTime.compareTo(calendarTwoToCompare) < 0);
}

说明

  1. 此方法永远不会考虑输入日期。
  2. 这将只需要输入日期的小时、分钟、秒和毫秒。
  3. 如果第一个参数是上午,第二个参数是下午,则认为日期相同。
  4. 如果第一个参数是下午,第二个是上午,则第二个参数被视为第二天。 如果当前时间是晚上 10 点,则在这种情况下。第一个参数是晚上 9 点,第二个参数是凌晨 3 点,函数将返回 true。第二个参数凌晨 3 点作为第二天的时间,晚上 10 点在今天和第二天凌晨 3 点之间。

【讨论】:

  • 这太棒了——但只有在时间在同一天时才有效。例如,如果我希望开始时间是晚上 9 点,而结束时间是凌晨 3 点,这将是行不通的。
  • 我在代码中花费的时间是 24 小时。如您所见,HOUR_OF_DAY。因此,对于您的情况,您必须设置 calendar.(Calendar.HOUR_OF_DAY,21);日历。(日历。日期,27); 9m。日历。(日历。HOUR_OF_DAY,3);日历。(日历。日期,28);凌晨 3 点。这会给你结果。
  • @Nxt3 我已经修改了代码。现在,如果在第二个参数通过并且第一个是 PM,那么这将把凌晨 3 点作为第二天。所以如果你的时间是晚上 10 点。参数是晚上 9 点和凌晨 3 点。这将返回 true。请询问是否有任何进一步的问题发生,
【解决方案2】:

你可以做的是从此时开始使用这个创建 2 个日期对象:

Date first = new Date();
first.setTime(time_in_milliseconds);

Date second = new Date();
first.setTime(time_in_milliseconds);

那么你可以通过这个得到当前时间

Date current = new Date();

然后使用这个条件:

if(current.after(first)&&current.before(second)){

//Do your work

}

希望这会有所帮助。

【讨论】:

  • 如果用户选择晚上 9 点的开始时间和凌晨 3 点的结束时间,我认为这不会起作用。时间会过去,比较不会一样。
  • 我在这里使用整个日期对象,所以它也会比较日期。
  • 我的一半问题源于我不知道如何为今天的开始和结束时间设置默认值,但在指定时间。因此,它必须每天更新——6 月 27 日晚上 8 点、6 月 28 日晚上 8 点等。
  • 那么你应该使用一个日期选择器......因为它很混乱,因为你不能确定时间是否介于没有天的 2 次之间。
  • 它用于夜间模式选择器。因此,如果用户希望夜间模式在晚上 9 点开始但在早上 6 点(第二天)结束——那么这必须发生。选择日期对于这样的功能没有意义。
【解决方案3】:

尝试在下面实现类似这种方法。可能需要一些修改。

private boolean isTimeBetween(long startMillis, long endMillis, long testMillis) {
   long startHour = (startMillis / (1000 * 60 * 60)) % 24;
   long startMinute = (startMillis / (1000 * 60)) % 60;
   long startSecond = (startMillis / 1000) % 60;
   long endHour = (endMillis / (1000 * 60 * 60)) % 24;
   long endMinute = (endMillis / (1000 * 60)) % 60;
   long endSecond = (endMillis / 1000) % 60;
   long testHour = (testMillis / (1000 * 60 * 60)) % 24;
   long testMinute = (testMillis / (1000 * 60)) % 60;
   long testSecond = (testMillis / 1000) % 60;

   if (startHour < endHour) {
      if (testHour > startHour && testHour < endHour) {
         return true;
      } else if ((testHour == startHour && testMinute > startMinute) || (testHour == endHour && testMinute < endMinute)) {
         return true;
      } else if ((testHour == startHour && testMinute == startMinute && testSecond > startSecond) || (testHour == endHour && testMinute == endMinute && testSecond < endSecond)) {
         return true;
      } else {
         return false;
      }
   } else if (startHour > endHour) {
      if ((testHour > startHour && testHour <= 24) && (testHour < endHour && testHour >= 0)) {
         return true;
      } else if ((testHour == startHour && testMinute > startMinute || (testHour == endHour && testMinute < endMinute))) {
         return true;
      } else if ((testHour == startHour && testMinute == startMinute && testSecond > startSecond || (testHour == endHour && testMinute == endMinute && testSecond < endSecond))) {
         return true;
      } else {
         return false;
      }
   } else {
      if (testMinute > startMinute && testMinute < endMinute) {
         return true;
      } else if ((testMinute == startMinute && testSecond > startSecond) || (testMinute == endMinute && testSecond < endSecond)) {
         return true;
      } else {
         return false;
      }
   }
}

(代码未测试)

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 2013-07-15
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多