2

3 日や 5 週間 (フィールド タイプが 1 つだけの期間) などの期間を指定DateTimeすると、その期間の最も近い単位に丸めたい (つまり、「5 日」の 5 は無視する)。例:

例 1:

  • 期間: 3日間。
  • DateTime:水曜日 4:26 AM UTC (2013-05-15T04:26:00Z)
  • 丸められた DateTime:水曜日の午前 0 時 (UTC) (2013-05-15T00:00:00Z)

例 2:

  • 期間: 5週間。
  • DateTime:水曜日 4:26 AM UTC (2013-05-15T04:26:00Z)
  • 丸められた DateTime:月曜日の午前 0 時 (UTC) (2013-05-13T00:00:00Z)

私の最初のアイデアは、PeriodDurationFieldType getFieldTypes()メソッドを使用し、 a 内の一致するすべてのフィールドDateTime(最大フィールドの下) に対して、それらをゼロに設定することでした。DateTimeFieldTypeただし、 a から sを取得するDateTime方法と、それらを a と比較する方法がわかりませんDurationFieldType

if else大げさなアプローチはしないほうがいいと思います。

4

2 に答える 2

1

以下の例は、期間を日で表すことができる場合の解決策です (週、月などに変更できます)。DateTime Joda Java ライブラリを使用します。

残念ながら、丸めが必要な場合、問題が発生する可能性があります。期間を計算するときからの開始時点が必要です。以下の例では、1970/01/01 00:00:00 UTC 以降の期間を計算します。それとも、実際に月(年)の初日から3日間の期間を取得するように求めていますか?それはもっと理にかなっています。

自問する必要がある質問: うるう日にはどうなりますか?

Java メソッド

DateTime roundDays(DateTime dt, int windowDays) {
    Duration p = Duration.standardDays(windowDays);

    long t = dt.getMillis() / p.getMillis() * p.getMillis();
    // Keep TimeZone and round floor to a day
    return new DateTime(t, dt.getZone()).dayOfMonth().roundFloorCopy();
}

使用例:

DateTime dt = new DateTime(1385578964580L, DateTimeZone.UTC);

System.out.println(roundDays(dt, 3));
System.out.println(roundDays(dt.plusDays(2), 3));
System.out.println(roundDays(dt.plusDays(4), 3));
System.out.println(roundDays(dt.plusDays(6), 3));

// Prints data rounded to every 3 days
// 2013-11-26T00:00:00.000Z
// 2013-11-29T00:00:00.000Z
// 2013-11-29T00:00:00.000Z
// 2013-12-02T00:00:00.000Z
于 2013-11-27T19:20:18.970 に答える
0

コメントするには長すぎます:

その「丸め」が何を意味するのかは明らかではありません。まず、LocalDateTimes ではなく sを処理する必要があります (これらは非常に異なるものです。こちらDateTimeの回答を参照してください)。

「期間」単位の解像度よりも低い解像度を持つすべてのフィールドをゼロに設定し、次のフィールドを指定された値の倍数に設定したいようです...そうですか?次に、私はあなたの 2 番目の例 (5 週間はどこですか?) を理解していません。とにかく、それはひどく指定されます: 「40 か月」の期間をどうするか?

于 2013-05-16T19:44:16.513 に答える