java - sera - ultimo pais en recibir el año nuevo 2018
¿Recibe primero el próximo lunes después de cierta fecha? (5)
Sé que aquí está la misma pregunta, pero probé la respuesta provista y devolvió un resultado que no entiendo. Estoy confundido por la respuesta y no creo que la salida sea correcta.
Necesito ayuda, gracias :)
GregorianCalendar date1 = new GregorianCalendar( 2014, 05, 12 ); //05 is june as month start from 0 -11
while( date1.get( Calendar.DAY_OF_WEEK ) != Calendar.MONDAY )
date1.add( Calendar.DATE, 1 );
System.out.println(date1);
Aquí está el resultado:
java.util.GregorianCalendar[time=1405267200000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Singapore",offset=28800000,dstSavings=0,useDaylight=false,transitions=9,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=6,WEEK_OF_YEAR=29,WEEK_OF_MONTH=3,DAY_OF_MONTH=14,DAY_OF_YEAR=195,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]
¿Dónde debo extraer el resultado para recuperar la fecha del lunes?
En lugar de System.out.println(date1);
use System.out.println(date1.getTime());
getTime
devuelve una instancia de Date
que representa el estado actual del Calendar
Que saldrá el Mon Jul 14 00:00:00 EST 2014
System.out.println(date1)
es el equivalente de usar System.out.println(date1.toString())
, que, en este caso, está volcando un montón de información útil sobre el estado del objeto Calendar
, pero no realmente datos humanos legibles
System.out.println(date1.getTime())
usará el método Date
toString
para mostrar un valor de fecha, formateado según la configuración local actual, que proporcionará más información útil.
Actualizado
En lugar de utilizar GregorianCalendar
, debe usar el Calendar
del sistema, por ejemplo ...
Calendar date1 = Calendar.getInstance();
date1.set(2014, 06, 12);
Además, los meses están indexados en 0
, lo que significa que Janurary en realidad es 0
no 1
, por lo que en su ejemplo, ha especificado el mes como julio, no junio.
Entonces, en cambio, usando ...
Calendar date1 = Calendar.getInstance();
date1.set(2014, 05, 12);
while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
date1.add(Calendar.DATE, 1);
}
System.out.println(date1.getTime());
Que dio salida ...
Mon Jun 16 16:22:26 EST 2014
Que es el próximo lunes a partir de hoy ... más o menos;)
Un cambio menor en tu código:
GregorianCalendar date1 = new GregorianCalendar(2014, 6, 12);
while (date1.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
date1.add(Calendar.DATE, 1);
}
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
System.out.println(sdf.format(date1.getTime()));
Rendimientos:
14-07-2014
EDITAR: Según la documentación de JavaDoc , el constructor que está utilizando espera un índice de mes basado en 0, por lo que para el mes de junio, deberá pasar un valor de 5, no de 6.
Solo una sugerencia: en lugar de hacer bucles, simplemente podría usar la instrucción switch junto con Calendar.add () de esta manera:
int weekdayNum = c.get(Calendar.DAY_OF_WEEK);
switch (weekdayNum) {
case 1: {
c.add(Calendar.DAY_OF_MONTH, 1);
break;
}
case 3: {
c.add(Calendar.DAY_OF_MONTH, 6);
break;
}
case 4: {
c.add(Calendar.DAY_OF_MONTH, 5);
break;
}
case 5: {
c.add(Calendar.DAY_OF_MONTH, 4);
break;
}
case 6: {
c.add(Calendar.DAY_OF_MONTH, 3);
break;
}
case 7: {
c.add(Calendar.DAY_OF_MONTH, 2);
break;
}
default:
break;
}
O simplemente haz algunas matemáticas simples. Como Calender.Monday
es igual a 2, es fácil calcular el número de días que se deben agregar a la fecha actual.
Calendar date1 = Calendar.getInstance();
date1.set(2014, 05, 12);
int dayOfWeek = date1.get(Calendar.DAY_OF_WEEK);
date1.add(Calendar.DATE, (9 - dayOfWeek) % 7);
tl; dr
LocalDate.of( 2014 , Month.JUNE , 12 )
.with( TemporalAdjusters.next( DayOfWeek.MONDAY ) )
Usando java.time
Está utilizando antiguas clases problemáticas de fecha y hora que ahora son heredadas, suplantadas por las clases java.time.
La clase LocalDate
representa un valor de solo fecha sin hora del día y sin zona horaria.
LocalDate ld = LocalDate.of( 2014 , Month.JUNE , 12 ) ;
Para obtener el siguiente lunes, use una implementación de TemporalAdjuster
encuentra en la clase TemporalAdjusters
.
LocalDate nextMonday = ld.with( TemporalAdjusters.next( DayOfWeek.MONDAY ) ) ;
Si desea ir con la fecha original si es un lunes, use el ajustador nextOrSame
.
LocalDate nextOrSameMonday = ld.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) ) ;
Acerca de java.time
El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora, como java.util.Date
, Calendar
y SimpleDateFormat
.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases de java.time?
- Java SE 8 , Java SE 9 y posterior
- Incorporado.
- Parte de la API Java estándar con una implementación integrada.
- Java 9 agrega algunas características y correcciones menores.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Androide
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
- Consulte Cómo utilizar ThreeTenABP ....
El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
y más .