我有以下代码,通常需要一些时间实例,将它们转换为毫秒以进行一些相当精确的计算,并根据具体情况在这些时间或小时之间产生等效的天数。我认为代码最能解释我想要实现的目标。以下是一些片段...
private int hours = 0;
/* This is intended to get the days between 'startDate' and 'endDate'
* and ensure it is between zero & the specified 'range' of days, inclusive*/
public int getPeriodBtw(Date startDate, Date endDate, int range)
{
int daysBtw = 0;
Calendar constantDate = Calendar.getInstance();
constantDate.setTime(startDate);
Calendar currentDate = Calendar.getInstance();
currentDate.setTime(endDate);
long rangePeriod = Period.ConvertDaysToMillis(range);
long duration = (constantDate.getTimeInMillis() + rangePeriod) - currentDate.getTimeInMillis();
daysBtw = (int)Period.ConvertMillisToDays(duration);
if(duration >= 0 && duration <= rangePeriod)
{
if(daysBtw == 0){
hours = (int)Period.ConvertMillisToHours(duration);
}
}
return daysBtw;
}
现在,上面的逻辑对我来说似乎都很紧密而且很好,但令人惊讶的是,随着currentDate
变化,我得到了奇怪的结果。我的意思是,通常我会期待这样的事情......见下图;
如果constantDate = 10:00am
如果range = 1 day
从constantDate
and 开始,让我们说currentDate = 2:00pm
在同一天(即在 内range
),
那么应该在and is之间daysBtw
返回 = 0
几个小时
现在这意味着是Less ,
因此应该是constantDate
currentDate
4hrs
currentDate
4hrs
range
duration
1day(24hrs) - 4hrs = 20hrs
当然,我认为在从纪元开始的毫秒偏移中处理这个问题是这样的;
10:00am(millis) + 1day(millis) - 2:00pm(millis)
=20hrs
long duration = (constantDate.getTimeInMillis() + rangePeriod) - currentDate.getTimeInMillis();
hours = (int)Period.ConvertMillisToHours(duration);
所以hours
应该返回 = 20
现在,如果currentDate
更改为3:00pm
,按照前面描述的相同逻辑,不应该hours = 19
???... 问题是,我的程序hours = 21
改为。
我真的很困惑我可能做错了什么。是我的逻辑有问题吗???...或者它在我的代码中的某个地方???...承认我已经花了几个小时断断续续地做这件事,我知道这很简单,我感到非常糟糕,但是时间不像往常一样是我的朋友,我必须继续做一些不那么琐碎的事情。任何形式的帮助将不胜感激。谢谢大家!