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

标签 java android sqlite date simpledateformat

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

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

最佳答案

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

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

ISO 8601

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

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

YYYY-MM-DDTHH:MM:SS.SZ

例如:

2016-04-28T18:22:20.123Z

此格式为字符串,可根据需要按时间顺序排序。

中间的 T 将日期部分与时间部分分开。末尾的 ZZulu 的缩写,表示 UTC。

通常,最佳做法是将您的日期时间值转换为 UTC 以用于存储和数据库。您的 JDBC 驱动程序可能会为您执行此操作,但我不知道 SQLite。

java.time

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

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

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

InstantUTC 中时间轴上分辨率为 nanoseconds 的时刻。

Instant instant = Instant.now();

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

String stringForDatabase = instant.toString();

在 Java 8 中,由于 Clock 接口(interface)的遗留实现,当前时刻被捕获到只有毫秒的分辨率,小数点后 3 位小数。例如,2016-04-29T00:12:57.123Z。在 Java 9 及更高版本中有一个现代的 Clock 实现,能够在计算机硬件时钟支持的范围内捕获最多 9 位小数(纳秒)的当前时刻。

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

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

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

Instant instant = Instant.parse( "2016-04-29T00:12:57.123456789Z" );

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

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

提取一个 Instant 存储回数据库。

Instant instant = zdt.toInstant();
String forDatabase = instant.toString();

关于java - 什么是适当的日期格式,以便字典顺序与时间顺序相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36922398/

相关文章:

java - 使用缓冲区读取二进制文件

Java - 高效的正则表达式来匹配日期和时间

ruby-on-rails - 与 SQLite 和 PostgreSQL 兼容的 LIKE 查询

java - 未调用自定义 AccessDeniedHandler

java - 添加文本文件中的值

java - android中的无处不在的ClassCastException

database - 使用 SQLite 触发器强制显式设置列值

java - 无法在 Android 上打开 sqlite 数据库

android - Bundle 的有效期是多久?

java - 根据实时跟踪地理点动态绘制线条