web-dev-qa-db-ja.com

DateUtils.truncate()と同等のJodaTime

私はこれまで JodaTime を使用したことがありませんでしたが、この質問に答えるには 月の序数の平日を取得する方法 です。

私はそれを試してみて、この醜いコードを思いついて、1日以内にすべてのフィールドの設定を解除しました:

DateTime startOfMonth =
    input.withDayOfMonth(1)
        .withHourOfDay(0)       // there
        .withMinuteOfHour(0)    // has got to
        .withSecondOfMinute(0)  // be a shorter way
        .withMillisOfSecond(0); // to do this

Commons/LangDateUtils を使用した同等の場所は

Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH);

JodaTimeでそれを行うための推奨イディオムは何ですか?

42

roundFloorCopy()を使用してDateUtils.truncateを模倣できます

Date truncateMonth = DateUtils.truncate(input, Calendar.MONTH);
-> DateTime truncateMonth = input.dayOfMonth().roundFloorCopy();

Date truncateMinute = DateUtils.truncate(input, Calendar.MINUTE);
-> DateTime truncateMinute = input.minuteOfDay().roundFloorCopy();

Date truncateHourOfDay = DateUtils.truncate(input, Calendar.HOUR_OF_DAY);
-> DateTime truncateHourOfDay = input.hourOfDay().roundFloorCopy()
44
Soundlink

withMillisOfDay()メソッドを使用して構文を短くします。

 DateTime startOfMonth = input.withDayOfMonth(1).withMillisOfDay(0); 
42
Erick Robertson

DateMidnight を見てください。

DateTime startOfMonth = new DateTime(new DateMidnight(input.withDayOfMonth(1)));

更新:2013-08-16 by JodaStephen:Joda-Timeのバージョン2.3はDateMidnightを廃止しました。これはクラスの非常に悪い考えでした。

だから使用:

DateTime startOfMonth = input.withDayOfMonth(1).withTimeAtStartOfDay();
21
Bozho

Joda TimeはDateTimeタイプの withFields メソッドもサポートしています。これは、短い構文を作成するためにも使用できます。

new DateTime().withDayOfMonth(1).withFields(new LocalTime(0, 0));

量産コードでは、withFieldsの引数を定数に分解する必要があります。

1
SpaceTrucker