1

銀行休業日と週末を合計期間にカウントしないことを考慮せずに、正常に機能するストップウォッチを実装しました。経過時間を取得し、開始時刻、終了時刻、および一連の銀行休業日 (週末はカウントされません) を渡すことができるオープンソース ライブラリを探していました。作業を簡単にする唯一のライブラリは net.sf.jtemporal ですが、機能を拡張する必要があります。必要な機能を取得するための便利なライブラリがあるかどうか、誰か教えてもらえますか?

4

5 に答える 5

2

そこで述べたよう、おそらく最善かつ最も簡単な方法は、各日に関する情報を含むテーブルを作成することです (最初からの稼働日/銀行休業日など; 1 日あたり 1 行 = 1 年あたり 365 行)。次に、count 関数を使用します。 / 適切な選択で。

于 2008-09-18T13:41:54.833 に答える
1

そのような特定の何かを見つけることができるとは思えません。しかし、独自のロジックを作成するのは簡単です。ここにいくつかの擬似コードがあります...

private long CalculateTimeSpan(DateTime BeginDate, DateTime EndDate, ArrayList<DateTime> BankHollidays)
{
    long ticks = 0;
    while (BeginDate <= EndDate) // iterate until reaching end
    {
        if ((BeginDate is holliday?) || (BeginDate is Weekend?))
             skip;
        else
             ticks += (24*60*60*1000);

        BeginDate = BeginDate + 1 day; // add one day and iterate
    }

    return ticks;
}
于 2008-09-18T13:54:22.510 に答える
0

Joda Timeをご覧ください。これは、Java に含まれているものよりもはるかに優れた日付/時刻 API です。

于 2008-09-18T13:57:29.070 に答える
0

これは、あなたが探しているものに対する有効な解決策になると思います。銀行休業日と週末をカウントせずに、経過時間を計算します (1 営業日は 24 時間であると見なします)。

/**
 * Calculate elapsed time in milliseconds
 * 
 * @param startTime
 * @param endTime
 * @return elapsed time in milliseconds
 */

protected long calculateElapsedTimeAux(long startTime, long endTime) { 
    CustomizedGregorianCalendar calStartTime = new CustomizedGregorianCalendar(this.getTimeZone());
    CustomizedGregorianCalendar calEndTime = new CustomizedGregorianCalendar(this.getTimeZone());
    calStartTime.setTimeInMillis(startTime);
    calEndTime.setTimeInMillis(endTime);
    long ticks = 0;

    while (calStartTime.before(calEndTime)) { // iterate until reaching end 
        ticks = ticks + increaseElapsedTime(calStartTime, calEndTime);
    }

    return ticks;
}

private long increaseElapsedTime(CustomizedGregorianCalendar calStartTime, CustomizedGregorianCalendar calEndTime) {
    long interval;
    long ticks = 0;

    interval = HOURS_PER_DAY*MINUTES_PER_HOUR*SECONDS_PER_MIN*MILLISECONDS_PER_SEC; // Interval of one day

    if ( calEndTime.getTimeInMillis() - calStartTime.getTimeInMillis() < interval) {
        interval = calEndTime.getTimeInMillis() - calStartTime.getTimeInMillis();
    }

    ticks = increaseElapsedTimeAux(calStartTime, calEndTime, interval);
    calStartTime.setTimeInMillis(calStartTime.getTimeInMillis() + interval);

    return ticks;
}

protected long increaseElapsedTimeAux(CustomizedGregorianCalendar calStartTime, CustomizedGregorianCalendar calEndTime, long interval) {
    long ticks = 0;

    CustomizedGregorianCalendar calNextStartTime = new CustomizedGregorianCalendar(this.getTimeZone());
    calNextStartTime.setTimeInMillis(calStartTime.getTimeInMillis() + interval);

    if ( (calStartTime.isWorkingDay(_nonWorkingDays) && calNextStartTime.isWorkingDay(_nonWorkingDays)) ) { // calStartTime and calNextStartTime are working days
        ticks = interval;

    }
    else {
        if (calStartTime.isWorkingDay(_nonWorkingDays)) { // calStartTime is a working day and calNextStartTime is a non-working day
            ticks = (calStartTime.getNextDay().getTimeInMillis() - calStartTime.getTimeInMillis());
        }
        else {
            if (calNextStartTime.isWorkingDay(_nonWorkingDays)) { // calStartTime is a non-working day and calNextStartTime is a working day
                ticks = (calNextStartTime.getTimeInMillis() - calStartTime.getNextDay().getTimeInMillis());
            }
            else {} // calStartTime and calEndTime are non-working days
        }
    }

    return ticks;
}
于 2008-09-26T08:54:31.687 に答える
0

銀行の営業時間も数えますか?午前9時~午後3時?それとも1日24時間ですか?

于 2008-09-18T13:28:39.937 に答える