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

  • La instancia de fragment se conserva pero el fragment hijo no se vuelve a adjuntar
  • XML a / desde Java / Kotlin, multiplataforma
  • Bt Socket cerró la exception
  • Forma correcta de usar genérico reificado en Kotlin
  • Android: comienza la animation cuando se carga el fragment
  • Kotlin: java.lang.NoSuchMethodError en las testings
  • ¿Es una buena práctica usar la function de ejecución en lugar de devolver en Kotlin?
  • ¿Puede JRebel volver a cargar las classs de Kotlin cuando son utilizadas por el plugin kotlin-maven-plugin en maven?
  • Cambio de color de text de edición de Android para @mentions y #hashtags mientras se escribe
  • Kotlin Spring Boot form-urlencoded Solicitudes POST con un map
  • La testing en Kotlin no puede acceder al método protegido