在 SQLite 数据库中存储 java.time.OffsetDateTime 的推荐方法

And*_*tus 4 java sqlite android

java.time.OffsetDateTime我正在寻找在 SQLite 数据库中存储 a 的最佳方法(在 Android 上,如果有帮助的话)。

出现这个问题是因为 SQLite 没有日期+时间的本机数据类型。

标准是我应该能够从以下方面产生合理的结果:

  1. 在“日期+时间”列上排序。
  2. 不会丢失微小的时间差异(毫秒)。
  3. 能够使用等效的BETWEEN或范围,WHERE
  4. 不丢失时区信息(设备可以全球使用和漫游)
  5. 希望保留一些效率。

目前我将时间戳存储为 ISO 格式的字符串。不确定这对于效率或比较来说是否理想。

也许可以选择转换为 UTC,然后转换为 long (Java),但我在 OffsetDateTime 中找不到返回自纪元以来的时间的函数(例如,Instant.ofEpochMilli)。

我应该提到的是,数据是在 Android 设备上存储和使用的。应用程序代码使用时间戳并执行简单的算术,例如“自某个事件以来过去了多少天”。因此数据正在存储类型和OffsetDateTime之间进行转换。

aka*_*kac 5

将日期时间存储为 ISO 8601 字符串(例如 2017-06-11T17:21:05.370-02:00)。SQLite 具有日期和时间函数,可对此类字符串(时区感知)进行操作。

java.time.OffsetDateTime可从 API 26 获取,因此我建议您使用 ThreeTenABP 库。

下面的例子:

private val formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME

val datetime = OffsetDateTime.now()

//###### to ISO 8601 string (with time zone) - store this in DB
val datetimeAsText = datetime.format(formatter) 

//###### from ISO 8601 string (with time zone) to OffsetDateTime
val datetime2 = formatter.parse(datetimeAsText, OffsetDateTime::from)
Run Code Online (Sandbox Code Playgroud)

为了使 SQL 查询了解时区,您需要使用 SQLite 中内置的日期和时间函数之一,例如,如果您想按日期和时间排序,您将使用datetime()函数:

SELECT * FROM cars ORDER BY datetime(registration_date)
Run Code Online (Sandbox Code Playgroud)