-2

日付が周期性と一致するかどうかを知る必要があります。たとえば、周期性が 1 時間で、ユーザーが指定した日付が 2021 年 13 月 9 日 23:00 の場合、Java コードが取得する必要がある初期値は 2021 年 9 月 13 日です。 00 を入力し、2021 年 13 月 9 日 23:00 の日付を取得するために 1 時間を追加する必要がある回数を確認します。

アイデアはループになり、日付に1時間を追加して配列に保存し、日付が配列内にあるかどうかと位置を確認します。他に方法はありますか?

4

2 に答える 2

1

私があなたの質問を正しく理解していれば、2 つの日付の間に何時間あるかを計算したいだけです。そのためには、組み込みjava.timeクラスを使用する方がクリーンです。2 つの日付をLocalDateTimeオブジェクトに読み取り、それらの間の期間を次のように計算できますChronoUnit.HOURS

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
LocalDateTime start = LocalDateTime.parse("13/09/2021 00:00", formatter);
LocalDateTime end = LocalDateTime.parse("13/09/2021 23:00", formatter);
long hours = ChronoUnit.HOURS.between(start, end);

結果は になります23

他のさまざまな単位 (分など) については、ChronoUnit.MINUTES. ドキュメントをご覧ください。選択できるさまざまなユニットがたくさんあります。

于 2021-09-13T21:45:51.577 に答える
1

QBruteによる正解と比較して、いくつかのマイナーな改良を加えています。

  1. 周期性は、時間、分、秒単位で指定できます。

  2. タイム ゾーンを考慮に入れているため、サマー タイムの移行 (スプリング フォワードとフォールバック) やその他の異常時でも正しい結果が得られます。

  3. 周期性の整数がない場合は、少なくとも十分な数があることを確認するために切り上げています。

    ZoneId userTimeZone = ZoneId.of("Africa/Dar_es_Salaam");
    
    Duration periodicity = Duration.ofMinutes(5);
    ZonedDateTime userTime = ZonedDateTime.of(2021, 9, 13, 23, 0, 0, 0, userTimeZone);
    ZonedDateTime initialTime = ZonedDateTime.of(2021, 9, 13, 0, 0, 0, 0, userTimeZone);
    
    Duration timeBetween = Duration.between(initialTime, userTime);
    long numberOfPeriodicities = timeBetween.dividedBy(periodicity);
    // Has truncation occurred?
    if (initialTime.plus(periodicity.multipliedBy(numberOfPeriodicities)).isBefore(userTime)) {
        // Need one more periodicity
        numberOfPeriodicities++;
    }
    
    System.out.println(numberOfPeriodicities);
    

出力は次のとおりです。

276

7.5 分の周期が必要な場合は、 を指定しますDuration.ofMinutes(7).plusSeconds(30)Duration.dividedBy(Duration)私が使用しているメソッドは、Java 9 で導入されました。

リンク: Oracle チュートリアル: Java.time の使用方法を説明する Date Time。

于 2021-09-14T04:47:20.173 に答える