android - pro - Samsung J7 regresa el primer día de la semana como 2
samsung j7 prime 2 precio (2)
Ok, tengo la solución. En lugar de usar getFirstDayOfWeek () pasé 1 como parámetro. Entonces está funcionando correctamente ahora.
_calendar.set(year, (month - 1), 1);
en lugar de
_calendar.set(year, (month - 1), _calendar.getFirstDayOfWeek());
He escrito un código para el calendario personalizado en el que estoy usando el objeto del calendario. He usado el método getFirstDayOfWeek () para recuperar el primer día de cada mes. Al cargar cada mes, el método "_calendar.getTime ()" devuelve la primera fecha. En todos los dispositivos, vuelve correctamente. Pero en Samsung J7, la fecha de inicio de la semana es 2. Aquí está mi registro de depuración para Samsung J7
java.util.GregorianCalendar [time = ?, areFieldsSet = false, indulgente = true, zone = Asia / Calcutta, firstDayOfWeek = 2, minimumDaysInFirstWeek = 4, ERA = 1, AÑO = 2016, MONTH = 10, WEEK_OF_YEAR = 41, WEEK_OF_MONTH = 3, DAY_OF_MONTH = 14, DAY_OF_YEAR = 288, DAY_OF_WEEK = 6, DAY_OF_WEEK_IN_MONTH = 2, AM_PM = 1, HOUR = 3, HOUR_OF_DAY = 15, MINUTO = 46, SEGUNDO = 58, MILLISECOND = 199, ZONE_OFFSET = 19800000, DST_OFFSET = 0
Dice firstDayOfWeek = 2, para el resto de los dispositivos se muestra como 1. ¿Alguna idea para la solución? Gracias.
tl; dr
- Parece que confundes el primer mes con el primer día de la semana.
- El
2
es una constante codificada que representa el lunes. - Aparentemente, su configuración regional predeterminada actual considera que el lunes es el primer día de la semana.
- Use java.time en su lugar.
Para el primer día de la semana:
LocalDate.now( ZoneId.of( "America/Montreal" ) )
.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) )
Para el primer día del mes:
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
.with( ChronoField.DAY_OF_MONTH , 1L )
Detalles
getFirstDayOfWeek () para recuperar el primer día de cada mes
Parece que confundes el primero de la semana con el primero del mes.
El primero del mes siempre es 1
por supuesto.
La primera de la semana es un día de la semana, como el domingo o el lunes, etc. La definición del primer día de la semana en la clase Calendar
varía, dependiendo de la Locale
. Por ejemplo, en gran parte de América del Norte, el primer día es domingo comúnmente. En gran parte de Europa, el primer día de la semana es el lunes.
Si no especifica una configuración Locale
, la clase Calendar
aplica implícitamente la configuración regional predeterminada actual de la JVM. Aparentemente en su configuración regional predeterminada, el primer día de la semana es el lunes. Lo deduzco porque informas el número 2
. Si exploras el Calendar.MONDAY
constante Calendar.MONDAY
, encuentras que es de hecho un int
primitivo de valor 2
.
Evite las clases heredadas de fecha y hora
La clase Calendar
tiene muchas decisiones de diseño deficientes. Considero que esta definición variable del día de la semana es uno de ellos. Una de las muchas razones para evitar estas clases de fecha y hora problemáticas, como Calendar
y Date
. Estas clases ahora son heredadas, suplantadas por las clases java.time.
Usando java.time
La clase LocalDate
representa un valor de solo fecha sin hora del día y sin zona horaria.
Un huso horario es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Por ejemplo, unos minutos después de la medianoche en París, Francia es un nuevo día cuando todavía está "ayer" en Montreal Québec .
Especifique un nombre de zona horaria adecuada en el formato continent/region
, como America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Nunca utilice la abreviatura de 3-4 letras, como EST
o IST
ya que no son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!).
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
Para obtener el primer día de la semana, (a) decida cuál es el primer día de la semana para usted, (b) utilice una implementación de TemporalAdjuster
definida en TemporalAdjusters
para obtener la fecha de un objeto enum de DayOfWeek
específico.
DayOfWeek firstDow = DayOfWeek.MONDAY ;
LocalDate ld = today.with( TemporalAdjusters.previousOrSame( firstDow ) ) ;
Para obtener un LocalDate
para un cierto día del mes, llame al método with
y pase un objeto enum desde ChronoField.DAY_OF_MONTH
.
LocalDate firstOfMonth = today.with( ChronoField.DAY_OF_MONTH , 1L ) ;
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 ....