6

在我的应用程序中,如果时间在用户选择的一天中的某些小时之间,我将更新一些内容。如果用户选择像“07-21”这样的东西,它工作正常,但不是“21-07”,它是过夜的。我检查时间的方法是获取当前小时并将其转换为毫秒。然后我检查当前毫秒是否在所选小时之间(这些也转换为毫秒)。像这样:

    if (currentMilli >= startHourMilli && currentMilli <= endHourMilli) 

问题:如果用户选择任何超过午夜的东西(例如 19-08),它就不起作用。

我已经尝试了很多东西,但我就是不知道该怎么做。

任何帮助表示赞赏!

4

7 回答 7

4

当你经过午夜时,你是否将一年中的日期加 1?否则你的 startHourMilli可能大于endHourMilli并且你的 if 子句永远是假的。

解决方案是使用add-methodCalendar 类。因此,我以小时为单位计算间隔的长度并将这个值添加到我们的日历实例中。

int start = 21; // let's take your failing example: 21-07
int end = 7;
int hours = (end - start) % 24; // here hours will be 14

Calendar cal = Calendar.getInstance();
// set calendar to TODAY 21:00:00.000
cal.set(Calendar.HOUR_OF_DAY, start);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

long startHourMilli = cal.getTimeInMillis();

// add 14 hours = TOMORROW 07:00:00.000
cal.add(Calendar.HOUR_OF_DAY, hours); 
long endHourMilli = cal.getTimeInMillis();

让我知道这是否有帮助:)

于 2013-01-29T22:08:12.217 回答
2

Date 具有比较两个日期的前后功能。希望本文档对您有所帮助:

http://developer.android.com/reference/java/util/Date.html#after(java.util.Date)

http://developer.android.com/reference/java/util/Date.html#before(java.util.Date)

最好的祝福。

于 2013-01-29T21:38:52.550 回答
1

最简单的检查方法..

val isDayTime : Boolean
    get() {
        val cal = Calendar.getInstance()
        val hour = cal.get(Calendar.HOUR_OF_DAY)
        return hour in 8..20
    }
于 2021-08-25T11:26:34.553 回答
0

我正在回答我自己的问题,因为我想我想出了一些可能适用于我正在尝试做的事情:

if(endHourMilli < startHourMilli){
if(currentMilli >= startHourMilli && currentMilli <= 23*3600000 || currentMilli >= 0 && currentMilli <= endHourMilli){
//Do whatever 
}
}else{
if (currentMilli >= startHourMilli && currentMilli <= endHourMilli) {
//Do whatever
}
}

即使 endMilli 小于 startMilli 也应该可以工作,还是我在这里搞砸了?

于 2013-01-31T15:36:35.917 回答
0

我知道我参加聚会有点晚了,但最近我开发了需要在给定时间范围内工作的 android 应用程序,由于我不喜欢与我一起工作,Calendar我最终使用了这样的东西:

// if start hour is later than end hour
// example: start = 21, end = 07
int startHourMilli = 21, endHourMilli = 07;
// just add one day (in your case in millis)
if (startHourMilli > endHourMilli) endHourMilli += 24 * 60 * 60 * 1000;
// now here you can check without any problems
if(currentMilli >= startHourMilli && currentMilli < endHourMilli){
    // within timeframe, do stuff you need
} else {
    // not in timeframe, find solution
}

现在我知道您为自己找到了一个解决方案,但我认为我的方法可能更容易理解(至少对于可能会感到困惑的新手而言)。

于 2014-09-11T17:47:52.667 回答
0

您始终可以使用简单的 if / else 24 小时格式,而无需使用函数或额外的计算:

例如 1:从 StartHour 到 StopHour 的完整时间段(停止时间包括所有分钟)

int StartHour = 23; //从23:00开始

int StopHour = 9; // 直到当前时间为 9,这将包括直到 9:59

int CurrentHour = 2;

if (StartHour > StopHour)
{
  if (CurrentHour < StartHour && StopHour < CurrentHour) 
  {Inside = false;}
  else
  {Inside = true;}
}
else
{
  if (CurrentHour >= StartHour && StopHour >= CurrentHour) 
  {Inside = true;}
   else
  {Inside = false;}
}

最后,如果 Inside == true CurrentHour 在时间范围内 StartHour - StopHour(full stop hour)

如果两者相等,则执行其他操作:
if (StartHour == StopHour) {.................};

例如 2:如果您想在这个确切的StopHour 时间停止,您需要进行一些更改:

int StartHour = 23; //从23:00开始

int StopHour = 9; // 这将在 8:59 后停止

int CurrentHour = 2;

if (StartHour2 > StopHour2)
{
  if (Hr24 < StartHour2 && StopHour2 <= Hr24) 
  {Quiet = false;}
  else
  {Quiet = true;}
}
else
{
  if (Hr24 >= StartHour2 && StopHour2 > Hr24) 
  {Quiet = true;}
   else
  {Quiet = false;}
}

最后,如果 Inside == true CurrentHour 在时间范围内 StartHour - StopHour(exact)

于 2014-10-10T14:58:45.827 回答
0

我认为 ottel142 几乎可以,但应该是:

 public static boolean checkIfNight() {
    int start = 21;
    int end = 7;
    int hours = 24 - start + end; 

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, start);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    long startHourMilli = cal.getTimeInMillis();
    KLog.e(cal.getTime());

    cal.add(Calendar.HOUR_OF_DAY, hours);
    long endHourMilli = cal.getTimeInMillis();

    long currentMilli = Calendar.getInstance().getTimeInMillis();


    if (currentMilli >= startHourMilli && currentMilli <= endHourMilli)
        return true;
    else return false;

}
于 2018-04-26T11:56:02.410 回答