2017-05-10 12 views
1

2日間の営業時間はどのように計算できますか? たとえば、2つの日付があります。 01/01/2017 10:00と04/01/2017 15:00。 また、平日の勤務時間は09:30〜17:30(8時間)です。 Javaで勤務時間と分を計算するにはどうすればいいですか?Javaの週末を除く2つの日付間の勤務時間を計算する

ありがとうございました。

+2

ここから開始できます。https://docs.oracle.com/javase/tutorial/datetime/iso/index.html – nandsito

+0

この種の問題について私が読んだ最善の方法は、日付のデータベースを維持し、 'isWeekday'、' isWeekend'、 'holidays'(おそらく外来キー)、' workingHours'など、関心のあるすべての属性の列を含んでいます。次に、ワーキングセットを作成するのは比較的簡単ですSQLクエリーからのレコードを取得し、軽いJava処理を続けます。 –

+0

関連:[Javaで2営業日の間に分を得る](https://stackoverflow.com/questions/28995301/get-minutes-between-two-working-days-in-java)そして、[土日を追加しないことを考慮して、営業日を追加する方法は? - Java](https://stackoverflow.com/questions/34943530/how-to-add-business-hours-to-date-considering-not-adding-weekends-java)。 –

答えて

2

私の頭の上から外してください。

java.timeパッケージを、サブパッケージ、現代のJavaの日時APIを使って学習することをお勧めします。 an Oracle tutorialとネット上の他の良い読書資料があります。

次は、(ユーザー、ドメイン)モデルとモデル(ドメイン、ビジネス層)を分離します。私は01/01/2017 10:00がどこかの入力文字列であると仮定しています。私はこれをインターフェースとして数えます。あなたのモデルでは、あなたのデータにdatetimeクラスとオブジェクトを使いたいでしょう。

タイムゾーンと夏時間(DST)を考慮する必要があるかどうかを考えます。夏時間は通常夜間に起こり、就業時間には起こらないので、私は思っていませんが、あなた自身の決定をしてください。この必要がある場合は、ZonedDateTimeオブジェクトに、それ以外の場合はLocalDateTimeに依存してください。

私は、勤務時間計算のための良い単体テストを書くことから始めます。また、入力文字列からLocalDateTimeまたはZonedDateTimeへの変換のためのものを書くかもしれませんが、ここで多くのテストは必要ありません。

LocalDateTimeオブジェクトに2つの日時値を解析するのに、DateTimeFormatterを使用します。その後、.atZone()に変換する必要がある場合は、ZonedDateTimeに変更してください。

モデル/私は、彼らが勤務時間外に落ちた場合、開始と終了日時を調整するために便利になると考えています時間の計算

this questionからインスピレーションを受け

作業。たとえば、開始時刻が土曜日の午前3時に開始する場合は、就業日の冒頭に月曜日に移動します。終了時刻が土曜日の午前3時である場合は、営業日の最後に金曜日に移動します。正確な方法に応じて、getDayOfWeektoLocalDateminusDaysplusDaysatTimeのようなメソッドが必要です。このステップをスキップして、後でそれが価値があるかどうかを確認してください。または、時刻を移動するだけで、日を変更することはできません。

次に、ChronoUnit列挙型が必要です。たとえば、ChronoUnit.WEEKS.between(startDateTime, endDateTime)で開始し、その期間内の完全な週数を調べます。 1週間あたりの労働時間数を掛けます。魅力的な選択肢は、Durationオブジェクトに時間を格納することです。なぜなら、とにかく後で必要と思うからです。残りの作業時間(日と時間)の間隔があるように、開始時間に週を追加します。

この時点では、日が作業日であるかどうか、作業日の終わりと開始時刻を調べる必要があるため、この時点ではさらに複雑になっています。 Durationクラスは、新しい開始日時から終了日時までの各営業日の時間、分、秒を合計するのに便利です。そのbetweenplusメソッドを使用できます。おそらく、新しい開始日時と終了日時が特別に同じ日付になるケースを処理する必要があります。

これが開始されないかどうかを確認してください。

関連する問題