2011-10-31 38 views
0

嗯,我目前正在爲android構建一個應用程序,我需要存儲一天並計算直到那一天到來的天數。在Android上計數日期

我存儲共享首選項的一天。首先,我初始化日曆。

  Calendar next = Calendar.getInstance(); 
     Calendar now = Calendar.getInstance(); 

然後我設定的「下一個」日曆

  nday = prefs.getInt("d", 0); 
      nmonth = prefs.getInt("m",0); 
      nyear = prefs.getInt("y",0); 
      next.set(nyear, nmonth, nday); 

然後,我這樣做是爲了計算在多少天內。

  diff =next.getTimeInMillis()-now.getTimeInMillis(); 
      diffDays = diff/(24 * 60 * 60 * 1000); 
      output.setText(diffDays + " Days left"); 

這就是問題所在。計算器在2天前工作得很好。當它應該說「3天」時,它寫着「2天」,它仍然有一天錯了。如果我嘗試關閉並打開應用程序,有時它會計算正確的日期,有時會錯過一天...有人可以理解最新的錯誤嗎?我有差異和diffDays只要。我想他們投以int,但我仍然得到了同樣的問題,有時它寫入還剩3天,有時2 ....


好,我發現瞭如何解決這個問題。看來中的getInstance有差異以毫秒爲單位,所以我做了這個

Calendar now = Calendar.getInstance(); 
    now.set(Calendar.HOUR_OF_DAY,00); 
    now.set(Calendar.MINUTE ,00); 
    now.set(Calendar.SECOND,00); 
    now.set(Calendar.MILLISECOND,00); 

從共享首選項

 nday = extras.getInt("nDay"); 
     nmonth = extras.getInt("nMonth"); 
     nyear = extras.getInt("nYear"); 
     //set the calendar 
     next.set(nyear, nmonth, nday, 00, 00,00); 
     next.set(Calendar.MILLISECOND,00); 

獲得當天最後計算出的差異

long diff = 0; 
    diff = next.getTimeInMillis()-now.getTimeInMillis(); 
    diffDays = diff/(24 * 60 * 60 * 1000); 
    output.setText(diffDays + " Days"); 

現在我得到了真正的差別沒有任何錯誤,謝謝大家的幫助!

+0

當您創建日期時,您是否正在清理它們,以便它們適當地參考午夜而不是創建它們的小時和分鐘? –

+0

我使用Calendar.getInstance() 我該如何清潔它們? –

+0

通過將MINUTES,SECONDS和MILLISECONDS字段設置爲0來清除它們。 – Stephan

回答

0

也使用日曆來計算日期。

Calendar diff = Calendar.getInstance(); 
long diffMillis = next.getTimeInMillis()-now.getTimeInMillis(); 
diff.setTimeInMilliSeconds(Math.abs(diffMillis)); 
int days = diff.get(Calendar.DAY_OF_YEAR); 

if (diffMillis < 0L) { 
    days *= -1; 
} 
+0

這是一個好主意,但我不能使用它,因爲如果第二天通過我想顯示-1,-2等...如果我嘗試用你的方式而不是-1它顯示365。好主意,但 –

+0

你可以通過使用毫秒的絕對值並在計算後簽署它來解決這個問題。我更新了代碼。 – Stephan

0

因爲它隱含地鑄造到很長時間,所以你正在失去你的幾分鐘和幾小時。

聲明diffDays爲雙倍,那麼您可以向用戶展示何時存在,例如2.5 days,它不會顯示爲2 days。或者,您可以將天數取整數部分,然後計算小數部分的小時數:

int hour = (diffDays - Math.floor(diffDays))*24 

這給出了分鐘。只要確保你確實宣佈diffDays爲雙倍或浮動。

+0

我嘗試過,但現在它寫道「1.0天」,仍然是錯誤的,有時當我關閉並打開它寫道「2.0天」。這怎麼會發生?有時它計算2天,有時3 ...也許如果我宣佈接下來的日期 - >「2-11-2011 00:00」現在 - >「31-10-2011 00:00」也許那麼我可以得到正確的區別 –

+0

但是,如果你以這種方式宣佈他們,你會失去小時......如果你不關心他們,你可以做到這一點。 – Jong

+0

是啊我不想要小時,我只是想在兩個日期之間的天差異。 –