-4

我有以下代码,通常需要一些时间实例,将它们转换为毫秒以进行一些相当精确的计算,并根据具体情况在这些时间或小时之间产生等效的天数。我认为代码最能解释我想要实现的目标。以下是一些片段...

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 dayconstantDate
and 开始,让我们说currentDate = 2:00pm在同一天(即在 内range),
那么应该在and is之间daysBtw返回 = 0
几个小时 现在这意味着是Less , 因此应该是constantDatecurrentDate 4hrs
currentDate 4hrsrange
duration1day(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改为。

我真的很困惑我可能做错了什么。是我的逻辑有问题吗???...或者它在我的代码中的某个地方???...承认我已经花了几个小时断断续续地做这件事,我知道这很简单,我感到非常糟糕,但是时间不像往常一样是我的朋友,我必须继续做一些不那么琐碎的事情。任何形式的帮助将不胜感激。谢谢大家!

4

1 回答 1

0

好的...我早些时候确实找到了解决此问题的方法...原来是由于;
1. 我这边的一些逻辑不好,还有
2. 使用java.util.concurrent.TimeUnit将毫秒转换为天时会丢失一些精度

TimeUnit.DAYS.convert(args, TimeUnit.MILLISECONDS);


它仍然让我感到震惊,为什么他们必须让该convert方法接收其毫秒参数long并返回天数long,而不创建设置首选的选项RoundingMode....无论如何,它已添加到我的 (STAY-AWAY-FROM) 短列表中-IT ) API。大声笑!

于 2013-03-14T19:03:07.410 回答