Kotlin LocalDateTime как Long

Я пытаюсь сохранить свое поле LocalDateTime как длинное, чтобы я мог сохранить его в своей базе данных SQLite. Как я могу это сделать?

var datetime = LocalDateTime.now()
var longdt: Long = getString(datetime).toLong()

person Clarke Woogner    schedule 12.05.2020    source источник


Ответы (2)


Вы можете использовать toEpochSecond() и ofEpochSecond() для преобразования в/из значения long с точностью до секунды.

Пример (на Java)

LocalDateTime now = LocalDateTime.now();
long nowInSeconds = now.toEpochSecond(ZoneOffset.UTC);
LocalDateTime dateTime = LocalDateTime.ofEpochSecond(nowInSeconds, 0, ZoneOffset.UTC);

System.out.println("now = " + now);
System.out.println("nowInSeconds = " + nowInSeconds);
System.out.println("dateTime = " + dateTime);

Вывод

now = 2020-05-12T12:12:36.984263200
nowInSeconds = 1589285556
dateTime = 2020-05-12T12:12:36

Если вам нужно значение long с точностью до миллисекунды, сделайте следующее:

LocalDateTime now = LocalDateTime.now();
long nowInMillis = now.toEpochSecond(ZoneOffset.UTC) * 1000
                 + now.get(ChronoField.MILLI_OF_SECOND);
LocalDateTime dateTime = LocalDateTime.ofEpochSecond(nowInMillis / 1000,
                  (int) (nowInMillis % 1000 * 1000000), ZoneOffset.UTC);

System.out.println("now = " + now);
System.out.println("nowInMillis = " + nowInMillis);
System.out.println("dateTime = " + dateTime);

Вывод

now = 2020-05-12T12:16:38.881510700
nowInMillis = 1589285798881
dateTime = 2020-05-12T12:16:38.881

При необходимости укажите смещение зоны, отличное от UTC, но в этом случае вам действительно следует использовать ZonedDateTime или OffsetDateTime вместо LocalDateTime.

person Andreas    schedule 12.05.2020

Если под длинным вы подразумеваете количество секунд или миллисекунд, используйте этот способ.

LocalDateTime в секундах эпохи

val seconds = datetime.atZone(ZoneOffset.UTC).toEpochSecond())

LocalDateTime в миллисекунды эпохи

val milliseconds = datetime.atZone(ZoneOffset.UTC)?.toInstant()?.toEpochMilli()
person Eklavya    schedule 12.05.2020
comment
Вопрос в том, как получить значение long из LocalDateTime, а не наоборот, показанное здесь. - person Andreas; 12.05.2020
comment
@Andreas Хорошо, я думаю, что долго означает секунду эпохи. Я не понимаю твою мысль. - person Eklavya; 12.05.2020
comment
Я просматривал старую версию этого ответа, которая преобразовала значение seconds в значение LocalDateTime. - person Andreas; 12.05.2020
comment
atZone() не может вернуть null, так зачем использовать ?.? --- Почему бы не использовать datetime.toEpochSecond(ZoneOffset.UTC)? --- Почему бы не использовать datetime.toInstant(ZoneOffset.UTC).toEpochMilli()? - person Andreas; 12.05.2020
comment
@Andreas Может быть, я что-то упустил, я не нашел toInstant() в этом документе разработчика. android.com/reference/kotlin/java/time/LocalDateTime - person Eklavya; 12.05.2020
comment
Развернуть из класса ChronoLocalDateTime (под списком методов). Это метод default из этого интерфейса. - person Andreas; 12.05.2020