2日間の営業時間はどのように計算できますか? たとえば、2つの日付があります。 01/01/2017 10:00と04/01/2017 15:00。 また、平日の勤務時間は09:30〜17:30(8時間)です。 Javaで勤務時間と分を計算するにはどうすればいいですか?Javaの週末を除く2つの日付間の勤務時間を計算する
ありがとうございました。
2日間の営業時間はどのように計算できますか? たとえば、2つの日付があります。 01/01/2017 10:00と04/01/2017 15:00。 また、平日の勤務時間は09:30〜17:30(8時間)です。 Javaで勤務時間と分を計算するにはどうすればいいですか?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時である場合は、営業日の最後に金曜日に移動します。正確な方法に応じて、getDayOfWeek
、toLocalDate
、minusDays
、plusDays
、atTime
のようなメソッドが必要です。このステップをスキップして、後でそれが価値があるかどうかを確認してください。または、時刻を移動するだけで、日を変更することはできません。
次に、ChronoUnit
列挙型が必要です。たとえば、ChronoUnit.WEEKS.between(startDateTime, endDateTime)
で開始し、その期間内の完全な週数を調べます。 1週間あたりの労働時間数を掛けます。魅力的な選択肢は、Duration
オブジェクトに時間を格納することです。なぜなら、とにかく後で必要と思うからです。残りの作業時間(日と時間)の間隔があるように、開始時間に週を追加します。
この時点では、日が作業日であるかどうか、作業日の終わりと開始時刻を調べる必要があるため、この時点ではさらに複雑になっています。 Duration
クラスは、新しい開始日時から終了日時までの各営業日の時間、分、秒を合計するのに便利です。そのbetween
とplus
メソッドを使用できます。おそらく、新しい開始日時と終了日時が特別に同じ日付になるケースを処理する必要があります。
これが開始されないかどうかを確認してください。
ここから開始できます。https://docs.oracle.com/javase/tutorial/datetime/iso/index.html – nandsito
この種の問題について私が読んだ最善の方法は、日付のデータベースを維持し、 'isWeekday'、' isWeekend'、 'holidays'(おそらく外来キー)、' workingHours'など、関心のあるすべての属性の列を含んでいます。次に、ワーキングセットを作成するのは比較的簡単ですSQLクエリーからのレコードを取得し、軽いJava処理を続けます。 –
関連:[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)。 –