Номер LocalDateTime ТипКонвертер - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужно иметь возможность хранить и извлекать свойства LocalDateTime в моей базе данных sqlite с помощью Rooms TypeConverters.

После некоторых исследований я реализовал приведенный ниже конвертер.Однако этот конвертер, похоже, хранит только время по умолчанию (1970-01-01).Так что не конвертирует правильно У кого-нибудь есть рабочий конвертер LocalDateTime?или есть какие-то улучшения для этого?

public class LocalDateTimeConverter {
@TypeConverter
public static LocalDateTime toDate(Long timestamp) {
    LocalDateTime ldt;
    if (timestamp == null){
        return null;
    }else{
        ldt = Instant.ofEpochMilli(timestamp).atZone(ZoneId.systemDefault()).toLocalDateTime();
    }
    return ldt;
}

@TypeConverter
public static Long toTimestamp(LocalDateTime date) {
    if (date == null){
        return  null;
    }else {
        return date.getLong(ChronoField.CLOCK_HOUR_OF_DAY);
    }
}}

1 Ответ

0 голосов
/ 28 февраля 2019

Я реализовал 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 часа.Было бы лучше использовать установленный часовой пояс для сохранения / загрузки, а затем преобразовать его в текущий часовой пояс устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...