Domanda

La mia API consente al client della biblioteca di passare la data:

method(java.util.Date date)

Lavorando con Joda-time, da questa data vorrei estrarre il mese e iterare in tutti i giorni di questo mese.

Ora, la data passata è di solito Nuova data () - Significato istante attuale. Il mio problema in realtà è impostare il nuovo Datemidnight (JDKDate) istanza per essere all'inizio del mese.

Qualcuno potrebbe dimostrare questo caso d'uso con Joda-time?

È stato utile?

Soluzione

La mezzanotte all'inizio del primo giorno del mese in corso è fornita da:

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

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

Se a partire da un java.util.Date, viene utilizzato un costruttore di Datemidnight diverso:

// 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

Altri suggerimenti

Un modo alternativo (senza prendere in considerazione Datemidnight) per ottenere il primo giorno del mese sarebbe usare:

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

Primo momento della giornata

Il Risposta di Ngeek è corretto, ma non riesce a dedicare il tempo al primo momento della giornata. Per regolare il tempo, aggiungere una chiamata a 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 );

Quando corri a Seattle US ...

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

Nota la differenza in queste due righe di output della console: -7 vs -8 a causa di Tempo dell'umiliare.


Generalmente si dovrebbe sempre specificare il fuso orario anziché fare affidamento su predefinito. Omesso qui per semplicità. Si dovrebbe aggiungere una linea come questa e passare l'oggetto fuso orario ai costruttori utilizzati nell'esempio sopra.

// 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

Quanto sopra è corretto ma obsoleto. La Biblioteca Joda-Time è ora soppiantata dal framework Java.time integrato in Java 8 e successivamente.

Il LocalDate Rappresenta un valore solo per la data senza ora del giorno e senza fuso orario. Un fuso orario è cruciale per determinare una data. Per un dato momento la data varia in base alla zona in tutto il mondo.

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

Usa uno dei TemporalAdjusters per ottenere il primo mese.

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

Il LocalDate può generare un ZonedDateTime Questo rappresenta il primo momento della giornata.

ZonedDateTime firstMomentOfCurrentMonth = firstOfMonth.atStartOfDay( zoneId );

Oh, non ho visto che si trattava di Jodatime. Comunque:

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());
}

O usando 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 è ora deprecato. Invece puoi fare:

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

Se conosci l'uso del fuso orario new LocalDate(date, timeZone) invece per una maggiore precisione.

Puoi anche fare .dayOfMonth().withMinimumValue() invece di .withDayOfMonth(1)

MODIFICARE:

Questo ti darà 12/1/YYYY 00:00 e 12/31/YYYY 00:00. Se preferisci l'ultimo del mese, essere effettivamente il primo del mese successivo (perché stai facendo una clausola tra), quindi rimuovi il minusDays(1) Dal calcolo dell'ultimofmonto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top