Question

Mon API permet au client de la bibliothèque de passer la date:

method(java.util.Date date)

Travailler avec Joda-temps, à partir de cette date, je voudrais extraire le mois et itérer tous les jours ce mois-ci.

Maintenant, la date passée est généralement Nouvelle date () - signifiant instantanément actuel. Mon problème est en fait définir le nouveau Datemidnight (jdkdate) Instance pour être au début du mois.

Quelqu'un pourrait-il démontrer ce cas d'utilisation avec Joda-temps?

Était-ce utile?

La solution

Minuit au début du premier jour du mois en cours est donné par:

// first midnight in this month
DateMidnight first = new DateMidnight().withDayOfMonth(1);

// last midnight in this month
DateMidnight last = first.plusMonths(1).minusDays(1);

Si vous partez à partir d'un java.util.date, un autre constructeur Datemidnight est utilisé:

// first midnight in java.util.Date's month
DateMidnight first = new DateMidnight( date ).withDayOfMonth(1);

Joda Time Java Doc - https://www.joda.org/joda-time/apidocs/overview-summary.html

Autres conseils

Une autre manière (sans prendre en compte Datemidnight) pour obtenir le premier jour du mois serait d'utiliser:

  DateTime firstDayOfMonth = new DateTime().dayOfMonth().withMinimumValue();

Premier moment de la journée

La Réponse de Ngeek est correct, mais ne parvient pas à mettre le temps au premier moment de la journée. Pour ajuster l'heure, ajoutez un appel à withTimeAtStartOfDay.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

org.joda.time.DateTime startOfThisMonth = new org.joda.time.DateTime().dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
org.joda.time.DateTime startofNextMonth = startOfThisMonth.plusMonths( 1 ).dayOfMonth().withMinimumValue().withTimeAtStartOfDay();

System.out.println( "startOfThisMonth: " + startOfThisMonth );
System.out.println( "startofNextMonth: " + startofNextMonth );

Lorsqu'on coule à Seattle nous…

startOfThisMonth: 2013-11-01T00:00:00.000-07:00
startofNextMonth: 2013-12-01T00:00:00.000-08:00

Notez la différence dans ces deux lignes de sortie de console: -7 vs -8 en raison de Heure d'économie du jour.


Généralement, il faut toujours spécifier le fuseau horaire plutôt que de compter sur la valeur par défaut. Omis ici pour simplicité. Il faut ajouter une ligne comme celle-ci et passer l'objet de fuseau horaire aux constructeurs utilisés dans l'exemple ci-dessus.

// Time Zone list: http://joda-time.sourceforge.net/timezones.html  (Possibly out-dated, read note on that page)
// UTC time zone (no offset) has a constant, so no need to construct: org.joda.time.DateTimeZone.UTC
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );

Java.Time

Ce qui précède est correct mais obsolète. La bibliothèque Joda-Time est désormais supplantée par le framework Java.Time intégré à Java 8 et plus tard.

La LocalDate représente une valeur de date uniquement sans heure de la journée et sans fuseau horaire. Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie selon la zone du monde entier.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );

Utilisez l'un des TemporalAdjusters pour obtenir le premier du mois.

LocalDate firstOfMonth = today.with( TemporalAdjusters.firstDayOfMonth() );

La LocalDate peut générer un ZonedDateTime Cela représente le premier moment de la journée.

ZonedDateTime firstMomentOfCurrentMonth = firstOfMonth.atStartOfDay( zoneId );

Oh, je n'ai pas vu qu'il s'agissait de Jodatime. De toute façon:

Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);

int min = c.getActualMinimum(Calendar.DAY_OF_MONTH);
int max = c.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int i = min; i <= max; i++) {
    c.set(Calendar.DAY_OF_MONTH, i);
    System.out.println(c.getTime());
}

Ou en utilisant Commons-Lang:

Date min = DateUtils.truncate(date, Calendar.MONTH);
Date max = DateUtils.addMonths(min, 1);
for (Date cur = min; cur.before(max); cur = DateUtils.addDays(cur, 1)) {
    System.out.println(cur);
}

DateMidnight est désormais obsolète. Au lieu de cela, vous pouvez faire:

LocalDate firstOfMonth = new LocalDate(date).withDayOfMonth(1);
LocalDate lastOfMonth = firstOfMonth.plusMonths(1).minusDays(1);

Si vous connaissez l'utilisation du fuseau horaire new LocalDate(date, timeZone) au lieu de plus pour une plus grande précision.

Vous pouvez aussi faire .dayOfMonth().withMinimumValue() à la place de .withDayOfMonth(1)

ÉDITER:

Cela vous donnera 12/1/YYYY 00:00 et 12/31/YYYY 00:00. Si vous plutôt le dernier du mois, être en fait le premier du mois suivant (parce que vous faites une clause entre minusDays(1) Du calcul de la dernière année

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top