2017-06-26 54 views
-1

我爲我的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)。 I've been trying the code found from this answer,但是當涉及到比較時,我認爲我從來沒有將當前時間置於默認值之間,因爲毫秒的日期永遠不會改變 - 只有小時和分鐘。

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

有一些解決這個方式,是簡單的比我做的呢?有點困惑與所有這一切。

+0

指https://stackoverflow.com/questions/9816459/removing-time-from-a-date-object找到如何剝去日期部分從時間戳。一種方法:使用日期格式「HH:mm:ss.SSS」 –

+0

我不清楚。 'getString(R.string.settings_night_mode_default_end_time)'和'nightModeEndTimeMillis'的價值是什麼?你能提供一些投入和預期產出的例子嗎? –

+0

這是一個時間選擇器。用戶選擇一個時間,我得到他們選擇的毫秒數。他們從不改變當天的日期 - 只有小時和分鐘。 'R.string.settings_night_mode_default_end_time'只是我以毫秒爲單位起訴的默認開始時間,'1483318830000'。 – Nxt3

回答

0

你可以做的是使用此創建這個時候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 

} 

希望這會有所幫助。

+0

如果用戶選擇9pm的開始時間和3am的結束時間,我不認爲這會起作用。時間會縮短並且比較不會一樣。 – Nxt3

+0

我在這裏使用整個日期對象,所以它也會比較日期。 –

+0

我的一半問題源於這樣一個事實,即我不知道如何爲當天的開始和結束時間設置默認值,但是在指定的時間。所以,它將不得不每天更新 - 6月27日晚上8點,6月28日晚上8點,等等。 – Nxt3

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. 如果第一個參數是am,第二個參數是pm,那麼認爲日期相同。
  4. 如果第一個參數是下午,第二個是上午第二個參數是第二天。 如果當前時間是晚上10點,則在這種情況下。第一個參數是晚上9點,第二個參數是凌晨3點,函數將返回true。第二參數3am作爲第二天的時間,如果今天晚上9點到第二天早上3點,則晚上10點。
+0

這真棒 - 但只適用於時間在同一天。例如,如果我想要將開始時間設爲晚上9點,但結束時間爲凌晨3點,則此操作將不起作用。 – Nxt3

+0

我在代碼中的時間是24小時。因爲你可以看到HOUR_OF_DAY。因此對於您的情況,您必須設置 日曆(Calendar.HOUR_OF_DAY,21); calendar。(Calendar.DATE,27);爲9米的 。 日曆。(Calendar.HOUR_OF_DAY,3); 日曆。(Calendar.DATE,28);凌晨3點到達 。 這會給你結果。 –

+0

@ Nxt3我修改了代碼。現在,如果在第二個參數中通過,並且第一個參數是PM,則第二天將採用凌晨3點。所以如果你的時間是晚上10點。參數是9點和3點。這將返回true。 Pelase確實詢問是否還有其他問題發生, –

0

嘗試實施類似下面的這種方法。可能需要一些修改。

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; 
     } 
    } 
} 

(代碼未測試)

相關問題