什么是适当的日期格式,以便字典顺序与时间顺序相同?

use*_*756 6 java sqlite android date simpledateformat

在我的 SQLite 数据库中,没有Date数据类型,所以我必须以文本格式存储时间戳。

格式是否会yyyy-MM-dd HH:mm导致正确的排序,以便当您按字典顺序对其进行排序(通过执行正常排序 ASC 或 DESC)时,它也固有地按时间值排序?

Bas*_*que 6

你的格式是正确的想法;按字母顺序排序时,它也是按时间顺序排列的。

\n\n

您可以更进一步,获得该格式的更好版本,即标准格式,以使您的工作更简单、更容易。

\n\n

ISO 8601

\n\n

ISO 8601标准为表示日期时间相关值的文本定义了多种实用的合理格式。

\n\n

对于日期和时间组合,格式为:

\n\n
\n

YYYY-MM-DDTHH:MM:SS.SZ

\n
\n\n

例如:

\n\n
\n

2016-04-28T18:22:20.123Z

\n
\n\n

这种字符串格式根据您的需要按时间顺序排序。

\n\n

中间T的 分隔日期部分和时间部分。Z最后的缩写是Zulu

\n\n

通常,最佳实践是将日期时间值转换为 UTC 以便存储和数据库。您的 JDBC 驱动程序可能会为您执行此操作,但我不了解 SQLite。

\n\n

java.time

\n\n

java.time框架内置于 Java 8 及更高版本中其中大部分功能在ThreeTen-Backport项目中向后移植到 Java 6 和 7 ,并在ThreeTenABP项目中进一步适应 Android 。

\n\n

这些新类取代了旧的java.util.Date/.Calendar和相关的类,这些类已被证明设计不佳且麻烦。

\n\n

在解析/生成日期时间值的文本表示形式时,这些类默认使用 ISO 8601 格式。在 Stack Overflow 中搜索许多示例。

\n\n

An是UTCInstant时间线上的一个时刻,分辨率为纳秒

\n\n
Instant instant = Instant.now();\n
Run Code Online (Sandbox Code Playgroud)\n\n

只需调用即可toString生成该值的字符串表示形式。

\n\n
String stringForDatabase = instant.toString();\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Java 8 中,由于接口的遗留实现,当前时刻仅捕获到毫秒分辨率Clock,对于秒的一小部分,精确到小数点后 3 位。例如,2016-04-29T00:12:57.123Z。在 Java 9 及更高版本中,有 的现代实现Clock,能够捕获最多 9 位小数(纳秒)的当前时刻,只要您的计算机\xe2\x80\x99s 硬件时钟支持即可。

\n\n

使用的默认格式化程序Instant:toString以 0、3、6 或 9 位数字打印秒的小数部分,根据需要使用多少个数字来表示秒的小数部分的非零部分。所有这些都按要求按字母顺序和时间顺序排序,因此您可以将其中任何一个存储在数据库中。

\n\n
    \n
  • 2016-04-29T00:12:57Z
  • \n
  • 2016-04-29T00:12:57.123Z
  • \n
  • 2016-04-29T00:12:57.123456Z
  • \n
  • 2016-04-29T00:12:57.123456789Z
  • \n
\n\n

这些都直接解析回Instant实例。因此,无需像问题中那样定义自己的格式模式。

\n\n
Instant instant = Instant.parse( "2016-04-29T00:12:57.123456789Z" );\n
Run Code Online (Sandbox Code Playgroud)\n\n

要查看特定地点的挂钟时间,请应用时区 ( ZoneId) 来获取ZonedDateTime.

\n\n
ZoneId zoneId = ZoneId.of( "America/Montreal" );\nZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );\n
Run Code Online (Sandbox Code Playgroud)\n\n

Instantfor 存储提取回数据库中。

\n\n
Instant instant = zdt.toInstant();\nString forDatabase = instant.toString();\n
Run Code Online (Sandbox Code Playgroud)\n


Pri*_*iya 1

是的。只是你不应该错过中间的任何 0。(“04”代表四月)。

有必要将四月表示为“04”,而不仅仅是“4”。