在我的SQLite数据库中,没有Date
数据类型,因此我必须以文本格式存储时间戳。
格式yyyy-MM-dd HH:mm
是否会产生正确的排序,以便按字典顺序排序(通过正常排序ASC或DESC),它还会按时间值排序?
答案 0 :(得分:1)
是。只是你不应该错过中间的任何0。 (' 04' 4月)。
有必要将April表示为' 04'而不只是' 4'
答案 1 :(得分:1)
您的格式是正确的想法;按字母顺序排序时,它也是按时间顺序排列的。
您可以更进一步,更好地使用该格式的标准格式,以使您的工作更简单,更轻松。
ISO 8601标准为表示与日期时间相关的值的文本定义了各种实用的合理格式。
对于日期和时间的组合,格式为:
YYYY-MM-DDTHH:MM:SS.SZ
例如:
2016-04-28T18:22:20.123Z
这种格式作为字符串按时间顺序排序。
中间的T
将日期部分与时间部分分开。最后Z
是Zulu
的缩写,意思是UTC。
通常,最佳做法是将日期时间值转换为UTC以用于存储和数据库。您的JDBC驱动程序可能会为您做到这一点,但我不了解SQLite。
java.time框架内置于Java 8及更高版本中。大部分功能都被后端移植到Java 6& ThreeTen-Backport项目中的7,并在ThreeTenABP项目中进一步适应Android。
这些新类取代旧的java.util.Date
/ .Calendar
以及相关的类,这些类已被证明设计糟糕且麻烦。
在解析/生成日期时间值的文本表示时,这些类默认使用ISO 8601格式。搜索Stack Overflow有很多例子。
Instant
是UTC中时间轴上的一个时刻,分辨率为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();