online joda examples dates create java date jodatime

examples - jodatime java 8



En Joda-Time, establece DateTime en el inicio del mes (5)

Primer momento del dia

La respuesta de ngeek es correcta, pero no pone la hora en el primer momento del día. Para ajustar la hora, agregue una llamada 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 );

Cuando se ejecuta en Seattle US ...

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

Note la diferencia en esas dos líneas de salida de consola: -7 vs -8 debido al horario de verano .

En general, siempre se debe especificar la zona horaria en lugar de confiar en el valor predeterminado. Omitido aquí por simplicidad. Uno debe agregar una línea como esta y pasar el objeto de zona horaria a los constructores utilizados en el ejemplo anterior.

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

Lo anterior es correcto pero desactualizado. La biblioteca de Joda-Time ahora está suplantada por el marco java.time incorporado en Java 8 y versiones posteriores.

LocalDate representa un valor de solo fecha sin hora del día y sin zona horaria. Una zona horaria es crucial para determinar una fecha. Para un momento dado, la fecha varía según la zona en todo el mundo.

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

Use uno de los TemporalAdjusters para obtener el primer mes.

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

El LocalDate puede generar un ZonedDateTime que representa el primer momento del día.

ZonedDateTime firstMomentOfCurrentMonth = firstOfMonth.atStartOfDay( zoneId );

Mi API permite que el cliente de la biblioteca pase la Fecha:

method(java.util.Date date)

Trabajando con Joda-Time , desde esta fecha me gustaría extraer el mes e iterar todos los días que contiene este mes.

Ahora, la fecha pasada es generalmente nueva Fecha () , que significa el instante actual. Mi problema en realidad es configurar la nueva instancia de DateMidnight (jdkDate) para comenzar el mes.

¿Alguien podría demostrar este caso de uso con Joda-Time ?


La medianoche al comienzo del primer día del mes actual viene dada por:

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

Si se inicia desde un java.util.Date, se usa un constructor DateMidnight diferente:

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

Joda Time java doc - http://joda-time.sourceforge.net/api-release/index.html


Oh, no vi que se trataba de jodatime. De todas formas:

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


Una forma alternativa (sin tener en cuenta DateMidnight) para obtener el primer día del mes sería usar:

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


DateMidnight ahora está en desuso. En su lugar puedes hacer:

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

Si conoce la zona horaria, use la new LocalDate(date, timeZone) para obtener una mayor precisión.

También puede hacer .dayOfMonth().withMinimumValue() lugar de .withDayOfMonth(1)

EDITAR:

Esto le dará 12/1/YYYY 00:00 y 12/31/YYYY 00:00 . Si prefiere que el último mes sea el primero del mes siguiente (porque está haciendo una cláusula entre), elimine los minusDays(1) del cálculo de lastOfMonth