2011-10-31 54 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

是啊我不想要小时,我只是想在两个日期之间的天差异。 –