-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
と の間の時間を返す必要があります 。これはLessであることを意味します。range = 1 dayconstantDate
currentDate = 2:00pmrange
daysBtw = 0
constantDatecurrentDate 4hrs
currentDate 4hrsrange
duration1day(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代わりに取得することです。

私は何が間違っているのだろうかと本当に混乱しています。問題は私のロジックにあるのでしょうか???... それともコードのどこかにあるのでしょうか???... 私は、かなり単純なことだとわかっているこのことに数時間費やしたり、消したりしたことを認めると、ひどく気分が悪くなります。しかし、いつものように時間は私の味方ではありません。どんな形の助けでも大歓迎です。ありがとうございます!

4

1 に答える 1

0

わかりました...私は以前にこの問題の解決策を見つけました...それが原因であることが判明しました。
1. 私の側のいくつかの悪いロジック、および2.ミリ秒から日への変換
に使用する場合の精度の損失java.util.concurrent.TimeUnit

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


優先値を設定するオプションを作成せずに、convertメソッドにミリ秒の引数を受け取り、long日も返すようにしなければならなかった理由は、まだ私を打ち負かしています.... とにかく、それは私の短いリストに追加されました ( -IT ) API。ロルズ!longRoundingMode

于 2013-03-14T19:03:07.410 に答える