通常、いくつかの時間のインスタンスを取り、それらをミリ秒に変換してかなり正確な計算を行い、場合によってはそれらの時間または時間の間の同等の日を生成する次のコードがあります。コードは、私が達成しようとしていることを最もよく説明していると思います。以下はいくつかのスニペットです...
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
と
の間の時間を返す必要があります
。これはLessであることを意味します。range = 1 day
constantDate
currentDate = 2:00pm
range
daysBtw
= 0
constantDate
currentDate
4hrs
currentDate
4hrs
range
duration
1day(24hrs) - 4hrs = 20hrs
もちろん、これをエポック wld からのミリ秒オフセットで処理すると、次のようになると思います。
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
代わりに取得することです。
私は何が間違っているのだろうかと本当に混乱しています。問題は私のロジックにあるのでしょうか???... それともコードのどこかにあるのでしょうか???... 私は、かなり単純なことだとわかっているこのことに数時間費やしたり、消したりしたことを認めると、ひどく気分が悪くなります。しかし、いつものように時間は私の味方ではありません。どんな形の助けでも大歓迎です。ありがとうございます!