2

1 日の特定の部分 (勤務時間など) を管理できるようにする API または類似のものを誰かが知っているかどうかを尋ねたい

私の問題は、次のコンテキストで時間を管理する必要があることです:

勤務時間が「午前 8 時から午後 2 時」と「午後 3 時から午後 6 時」で、サマータイムが「午前 8 時から午後 2 時」の会社で働いているとします。具体的な日付の具体的な瞬間が労働的な瞬間なのか、そうでないのかを知りたい.

たとえば、前述のカレンダーがあり、「2012 年 8 月 13 日午後 9 時」が稼働時間かどうかを API に尋ねると、API はそれをチェックして正しい答え (この場合は false) を返す必要があります。 2012 年 8 月 13 日午前 9 時」は、「true」を返さなければならない作業の瞬間です。

その他の重要な関連事項。上記のカレンダーを使用して、2 つの日付間の間隔を計算する必要があります。たとえば、開始時刻を「今日の午後 5 時」に設定し、終了時刻を「明日の午前 10 時」に設定した場合、3 時間 (または秒またはミリ秒に相当) を返す必要があります。このカレンダーの終了日。

また、休日(各国固有)にも対応する必要があります。「JollyTime」という API 呼び出しを見つけましたが、休日には動作しますが、勤務時間には対応していません...

何か案が?

4

3 に答える 3

1

更新: Joda-Time ライブラリは現在メンテナンス モードに入っています。主な作成者である Stephen Colebourne は、Java 8 以降に組み込まれたjava.timeクラスを定義する JSR 310 を率いています。


ここでは、日時を高度にサポートする優れたデータベースが役立つ場合があります。そのようなデータベースの 1 つはPostgresで、適切な日時データ型コマンド (「関数」)を備えています。

Joda -Timeフレームワークも役立つ場合があります。Intervalクラスとその親クラスは、開始日時と停止日時のペアの間の期間を定義します。それらは、contains、overlaps、isBefore、is After などの比較方法を提供します。

Joda-Time 2.3 を Java 7 で使用するためのコード例を次に示します。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );

List<Interval> workIntervalsFor13Aug2012 = new ArrayList<Interval>( 2 );
DateTime start, stop;
Interval interval;

start = new DateTime( 2012, 8, 13, 8, 0, 0, timeZone );
stop = new DateTime( 2012, 8, 13, 14, 0, 0, timeZone );
interval = new org.joda.time.Interval( start, stop );
workIntervalsFor13Aug2012.add( interval );

start = new DateTime( 2012, 8, 13, 15, 0, 0, timeZone );
stop = new DateTime( 2012, 8, 13, 18, 0, 0, timeZone );
interval = new org.joda.time.Interval( start, stop );
workIntervalsFor13Aug2012.add( interval );

// Check a date-time against those work intervals.
DateTime test09 = new DateTime( 2012, 8, 13, 9, 0, 0, timeZone );
DateTime test21 = new DateTime( 2012, 8, 13, 21, 0, 0, timeZone );

// You should write a "dateTimeIsInWorkingInterval" method that performs this loop.
Boolean hit = false;
for ( Interval nthInterval : workIntervalsFor13Aug2012 ) {
    if( nthInterval.contains( test09 )) {
        hit = true;
        break;
    }
}
if( hit ) {
    System.out.println( "This date-time: " + test09 + " occurs during a work interval.");
} else {
    System.out.println( "This date-time: " + test09 + " occurs outside a work interval.");
}

hit = false;
for ( Interval nthInterval : workIntervalsFor13Aug2012 ) {
    if( nthInterval.contains( test21 )) {
        hit = true;
        break;
    }
}
if( hit ) {
    System.out.println( "This date-time: " + test21 + " occurs during a work interval.");
} else {
    System.out.println( "This date-time: " + test21 + " occurs outside a work interval.");
}

実行すると…</p>

This date-time: 2012-08-13T09:00:00.000+02:00 occurs during a work interval.
This date-time: 2012-08-13T21:00:00.000+02:00 occurs outside a work interval.
于 2013-12-24T22:06:01.990 に答える
0

JODA Time ライブラリを見てください。間隔があり、必要なものかもしれません。

于 2012-08-13T12:12:49.407 に答える