web-dev-qa-db-fra.com

Équivalent JodaTime de DateUtils.truncate ()

Je n'ai jamais utilisé JodaTime auparavant, mais en répondant à cette question, Comment obtenir des jours de semaine ordinaux en un mois .

Je l'ai essayé et j'ai trouvé ce code moche pour débloquer tous les champs ci-dessous le jour:

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

Où l'équivalent Commons/Lang utilisant DateUtils serait

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

Quel est l'idiome préféré pour faire cela dans JodaTime?

42

Vous pouvez utiliser roundFloorCopy () pour imiter 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

tilisez la méthode withMillisOfDay() pour raccourcir la syntaxe.

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

Jetez un œil à DateMidnight .

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

Mise à jour: 16/08/2013 par JodaStephen: La version 2.3 de Joda-Time déprécie DateMidnight car c'était une très mauvaise idée d'une classe.

Alors utilisez:

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

Joda Time prend également en charge la méthode withFields dans le type DateTime. Cela peut également être utilisé pour créer une syntaxe courte:

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

Dans le code de production, l'argument de withFields doit être factorisé en une constante.

1
SpaceTrucker