什么是适当的日期格式,因此词典排序与时间排序相同?

时间:2016-04-28 18:10:31

标签: java android sqlite date simpledateformat

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

格式yyyy-MM-dd HH:mm是否会产生正确的排序,以便按字典顺序排序(通过正常排序ASC或DESC),它还会按时间值排序?

2 个答案:

答案 0 :(得分:1)

是。只是你不应该错过中间的任何0。 (' 04' 4月)。

有必要将April表示为' 04'而不只是' 4'

答案 1 :(得分:1)

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

您可以更进一步,更好地使用该格式的标准格式,以使您的工作更简单,更轻松。

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及更高版本中。大部分功能都被后端移植到Java 6& ThreeTen-Backport项目中的7,并在ThreeTenABP项目中进一步适应Android。

这些新类取代旧的java.util.Date / .Calendar以及相关的类,这些类已被证明设计糟糕且麻烦。

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

InstantUTC中时间轴上的一个时刻,分辨率为nanoseconds

Instant instant = Instant.now();

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

String stringForDatabase = instant.toString();

在Java 8中,由于Clock接口的遗留实现,当前时刻被捕获到毫秒分辨率,小数点后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();