Forma rápida de get el número de mes de java.util.Date

Tengo una vista de reciclador en mi aplicación de Android con muchas dates. Para orderar los datos e insert separadores entre elementos agrupados por mes + año, utilizo las siguientes funciones:

private fun monthFromDate(date: Date): Int { val calendar = Calendar.getInstance() calendar.time = date return calendar.get(Calendar.MONTH) } private fun yearFromDate(date: Date): Int { val calendar = Calendar.getInstance() calendar.time = date return calendar.get(Calendar.YEAR) } 

Creo que su mala idea siempre llama a Calendar.getInstance (). No quiero introducir una variable local tampoco. (Por cierto, todos los methods como date.month date.year están en desuso )

La pregunta: Tengo dos instancias de util.java.Date. Permítales ser iguales si ambos mes y año son iguales. ¿Cómo puedo implementar esta diversión de manera rápida y óptima?

java.time

ShaharT en una respuesta ya mencionó Java 8 como una opción. Incluso en Android Java 7 creo que vale la pena considerar el uso de JSR-310, la API moderna de date y hora de Java, también conocida como java.time para su tarea. Salió con Java 8, pero puedes usarlo también. Por lo general, es mucho más agradable trabajar con él. Incluye una class YearMonth para representar un año y un mes, justo lo que necesita, y esto le ahorra el uso de dos funciones y la creación de instancias de un object de Calendar para cada una de esas dos llamadas al método. Así que quería mostrarle la forma correcta de hacer esa conversión.

Lamento no poder escribir el código de Kotlin. Tendrá que conformarse con el código Java, y confío en que se adaptará. El código de Java es:

 private ZoneId zone = ZoneId.of("Europe/Moscow"); private YearMonth yearMonthFromDate(Date date) { ZonedDateTime dateTime = date.toInstant().atZone(zone); return YearMonth.from(dateTime); } 

Por favor, inserte su zona horaria deseada si no desea Europa / Moscú.

Ahora que lo hace, si va por esta avenida, también puede considerar si desea objects Date en su aplicación, o si prefiere classs de JSR-310. Las classs de Date y Calendar se consideran anticuadas.

Actuación

En mi Mac ejecuté 100 000 objects Date través del método anterior en 37 milisegundos. Puede que no sea lo mismo en un dispositivo Android promedio, pero no estoy convencido de que deba preocuparse por la rapidez de la conversión. La regla general es que no debe preocuparse hasta que vea un problema en una configuration realist. Si no está seguro, pruebe en un entorno realist a la brevedad posible.

Para usar en Android

Para usar JSR-310 en Android necesitarás tener ThreeTenABP (ABP para Android backport). Está todo muy bien y completamente explicado en esta pregunta: Cómo usar ThreeTenABP en Android Project .

Date.getMonth() aunque obsoleto está bien. Java mantiene la compatibilidad hacia atrás.

Si usa Java 8, puede hacer un benchmark de su versión Calendar.getInstance().get(Calendar.MONTH) versus el nuevo LocalDate.ofEpochDay(new Date().getTime()).getMonthValue()

No está muy claro, ¿por qué Calendar.getInstance () es subóptimo? Sin embargo, para su requisito, ¿qué hay de codificarlo así:

 private fun getYearMonth(date: Date): Int { val calendar = Calendar.getInstance() calendar.time = date return calendar.get(Calendar.YEAR) * 100 + calendar.get(Calendar.MONTH) } 

Te da acceso a yearMonth en solo interger, como 201711

  • Clase de datos de Kotlin, sala de Android y setter personalizado
  • Refactorización del código de Kotlin
  • Buscador de properties o setter esperado en Kotlin
  • kotlin: algunos problemas con arreglos en annotations
  • Anotación de la invalidation de fuente Java generada (para Kotlin)
  • Dagger2 no funciona en Android
  • Cómo get la llamada de la function kotlin
  • Ejecutar service en segundo plano
  • Los types de plataforma de llamada de Kotlin dan como resultado llegalStateException
  • ¿Cómo puedo ejecutar una sola testing de Android usando Kotlin?
  • Solo las dependencies se copyn cuando se implementan plugins intellij