Я пытаюсь сохранить свое поле LocalDateTime как длинное, чтобы я мог сохранить его в своей базе данных SQLite. Как я могу это сделать?
var datetime = LocalDateTime.now()
var longdt: Long = getString(datetime).toLong()
Я пытаюсь сохранить свое поле LocalDateTime как длинное, чтобы я мог сохранить его в своей базе данных SQLite. Как я могу это сделать?
var datetime = LocalDateTime.now()
var longdt: Long = getString(datetime).toLong()
Вы можете использовать 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
.
Если под длинным вы подразумеваете количество секунд или миллисекунд, используйте этот способ.
LocalDateTime в секундах эпохи
val seconds = datetime.atZone(ZoneOffset.UTC).toEpochSecond())
LocalDateTime в миллисекунды эпохи
val milliseconds = datetime.atZone(ZoneOffset.UTC)?.toInstant()?.toEpochMilli()
long
из LocalDateTime
, а не наоборот, показанное здесь.
- person Andreas; 12.05.2020
seconds
в значение LocalDateTime
.
- person Andreas; 12.05.2020
atZone()
не может вернуть null
, так зачем использовать ?.
? --- Почему бы не использовать datetime.toEpochSecond(ZoneOffset.UTC)
? --- Почему бы не использовать datetime.toInstant(ZoneOffset.UTC).toEpochMilli()
?
- person Andreas; 12.05.2020
toInstant()
в этом документе разработчика. android.com/reference/kotlin/java/time/LocalDateTime
- person Eklavya; 12.05.2020
ChronoLocalDateTime
(под списком методов). Это метод default
из этого интерфейса.
- person Andreas; 12.05.2020