es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo convertir LocalDate a Long en Kotlin / Java

Necesito establecer la fecha en el selector de fecha de material. Requiere un tipo Long para establecer la fecha. Intenté hacerlo con:

val formatter = DateTimeFormatter.ofPattern(DAY<em>FORMAT</em>PATTERN)
val selectedDate = LocalDate.parse(viewModel.selectedDateStateFlow.value, formatter)
val selectedDateToLong = selectedDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli()

<p>val datePicker = MaterialDatePicker.Builder.datePicker()
    .setTheme(R.style.DatePicker)
    .setSelection(selectedDateToLong)
    .build()

en este caso, el selector de fecha establece la fecha un día menos. ¿Hay una opción de conversión más precisa?

Por ejemplo:

I/System.out: viewModel.selectedDateStateFlow.value = 30 Nov, 2021
I/System.out: selectedDate = 2021-11-30
I/System.out: selectedDateToLong = 1638219600000
I/System.out: MaterialDatePicker.todayInUtcMilliseconds() = 1638230400000

pero el selector de fecha establece “Nov 29, 2021”

La zona horaria del teléfono es GMT+03:00 Hora Estándar de Moscú.

Actualización
Comparé el valor de mi conversión de LocalDate a Long y MaterialDatePicker.todayInUtcMilliseconds(). Obtuve valores diferentes. ¿Cuál es mi error de traducción?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con la zona horaria utilizada para convertir LocalDate a Long. En el código proporcionado, LocalDate se convierte en Instant utilizando la zona horaria predeterminada del sistema, que puede no ser la misma que la zona horaria utilizada por MaterialDatePicker.

    Para garantizar que la conversión sea precisa y que utilice la misma zona horaria que MaterialDatePicker, puedes utilizar la zona horaria ZoneOffset.UTC en lugar de la zona horaria predeterminada del sistema, de la siguiente manera:

    val selectedDateToLong = selectedDate.atStartOfDay(ZoneOffset.UTC).toInstant().toEpochMilli()
    

    Esto convertirá LocalDate en Instant utilizando la zona horaria UTC, que es la zona horaria utilizada por MaterialDatePicker. Esto debería resultar en la fecha correcta establecida en el selector de fecha.

    Además, puedes comprobar la zona horaria utilizada por MaterialDatePicker y asegurarte de que coincida con la zona horaria utilizada en tu código. Esto se puede hacer utilizando el método MaterialDatePicker.todayInCurrentTimeZone(), que devuelve la fecha actual en la zona horaria utilizada por el selector de fecha.

Comments are closed.