2010-11-09 35 views
38

Je n'ai jamais utilisé JodaTime avant, mais en répondant à cette question, How to get ordinal Weekdays in a Month.JodaTime équivalent de DateUtils.truncate()

Je l'ai essayé et est venu avec ce code laid désinitialiser tous les champs ci-dessous 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 

Lorsque le Commons/Lang équivalent en utilisant DateUtils serait

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

Quel est l'idiome préféré de le faire dans JodaTime?

Répondre

39

Vous pouvez utiliser roundFloorCopy() pour mimer 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() 
+1

De loin le meilleur à mon avis. J'avais besoin que la date soit "arrondie" par quelque chose sélectionné par l'utilisateur. En utilisant [code] input.property (). RoundFloorCopy() [/ code] a sauvé beaucoup de codage personnalisé. – DeezCashews

17

Jetez un oeil à DateMidnight.

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

Mise à jour: 16/08/2013 par JodaStephen: Version 2.3 de Joda-Time deprecates DateMidnight comme il était une très mauvaise idée d'une classe.

Il faut donc utiliser:

DateTime startOfMonth = input.withDayOfMonth(1).withTimeAtStartOfDay(); 
+0

donc je suppose que vous voulez dire ceci: 'new DateMidnight (new DateTime())' –

+1

@Erick vrai, mais à mon humble avis pas une raison pour un downvote. C'est toujours une bonne réponse –

+2

Je ne comprends pas pourquoi c'est une meilleure réponse que d'utiliser 'withMillisOfDay (0)'. Un objet 'DateMidnight' n'est pas un objet' DateTime', donc un objet supplémentaire doit être créé de cette façon. –

38

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

 
DateTime startOfMonth = input.withDayOfMonth(1).withMillisOfDay(0); 
+0

La réponse de Bozho est probablement la solution "officielle", mais j'aime mieux celle-ci. Merci. –

+0

Pourquoi pensez-vous cela? Je ne comprends pas. J'aime aussi celui-ci, car il nécessite le nombre minimum d'objets à créer. –

+0

Pourquoi est-ce que je penserais ça? Parce qu'une classe dédiée existe pour ce genre de problème. –

1

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 withFields devrait être factoriser à une constante.