Я реализовал LocalDateTimeConverter
в моей библиотеке, Чемодан, здесь .Имейте в виду, что это расширяет мой BaseConverter
класс здесь .Примечание: это все в Котлине.
Если вы хотите реализовать себя, я бы порекомендовал хранить это как String, а не как метку времени.Если вы посмотрите ссылки выше, вы увидите, что я сначала конвертирую дату в строку, используя toString()
, а затем обратно в LocalDateTime
, используя функцию parse()
.
Вот это на Java:
public class LocalDateTimeConverter {
@TypeConverter
public static LocalDateTime toDate(String dateString) {
if (dateString == null) {
return null;
} else {
return LocalDateTime.parse(dateString);
}
}
@TypeConverter
public static String toDateString(LocalDateTime date) {
if (date == null) {
return null;
} else {
return date.toString();
}
}
}
Редактировать:
Причина, по которой код, который вы используете выше, не работает, заключается в том, что в вашей функции toTimestamp()
выпросто просят час дня как Long
.Итак, учитывая LocalDateTime
, то есть 1 января 2019 года, 12:00 вечера, вы сохраняете 12
.Таким образом, в toDate
вы просите преобразовать метку времени 12
в LocalDateTime
, которая будет 12 миллисекунд после полуночи 1 января 1970 года.
Вы можете продолжить использовать метки времени для хранениясвою дату, просто изменив эту строку в toTimestamp()
на date.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()
.Это даст вам фактическую временную метку для LocalDateTime
в текущем часовом поясе.Обратите внимание на часовые пояса здесь: поскольку вы используете системный часовой пояс по умолчанию для сохранения / загрузки в / из базы данных, вы можете получить неправильное значение, если система изменит временные пояса.Если я использую ваше приложение в Нью-Йорке, а затем снова открою приложение в Сан-Франциско, все время будет отключено на 3 часа.Было бы лучше использовать установленный часовой пояс для сохранения / загрузки, а затем преобразовать его в текущий часовой пояс устройства.