如何更改默认的SQLite时区?
插入我的记录时,我希望SQlite使用+3:30
时区。
答案 0 :(得分:3)
SQLite's supported date formats没有包含时区。通常,日期假定为UTC;没有'默认'时区。
可以在UTC和本地时区之间转换日期值,或者为时间戳添加固定的偏移量,但结果仍然没有时区标记,所以你应该只在你要去的时候这样做格式化时间戳显示。
要进行比SQLite支持更多的时区处理,您必须在应用程序的Java代码中处理此问题。
答案 1 :(得分:1)
Answer by CL.是正确的,应该被接受。
如上所述,您应该使用优秀的java.time框架在Java代码中进行时区处理。
{8}类内置于Java 8及更高版本中。他们的大部分功能已经被移植到Java 6& java.time项目中的7,并在ThreeTen-Backport项目中进一步适应Android。
java.time类是非常成功的Joda-Time库的继承者,这两个项目由同一个人ThreeTenABP领导。 java.time类取代了与最早版本的Java捆绑在一起的臭名昭着的旧日期时间类。
最佳做法通常是在Stephen Colbourne中进行业务逻辑,数据存储和数据交换。大多数数据库以UTC格式存储日期时间。如上所述,SQLite(“lite”)不支持时区,因此您应将日期时间值调整为UTC以插入SQLite。
由于这个原因和其他原因,程序员应该学会在工作中考虑UTC。
如果您确定要使用+03:30
的偏移量,请使用UTC和ZoneOffset
类。顺便说一句,始终使用小时的前导零,+03:30
而非+3:30
;按惯例共同,并且是某些软件和协议所要求的。
ZoneOffset zoneOffset = ZoneOffset.of( 3 , 30 );
OffsetDateTime odt = OffsetDateTime.of( 2016 , 1 , 2 , 12 , 0 , 0 , 0 , zoneOffset ); // Noon on Jan 2 in offset `+03:30`.
时区是OffsetDateTime
加上一组调整异常情况的规则,例如offset-from-UTC。如果您知道预期的时区,通常最好使用它而不是仅仅偏移。例如,Asia/Tehran
。使用ZoneId
和ZonedDateTime
。
ZoneId zoneId = ZoneId.of( "Asia/Tehran" );
ZonedDateTime zdt = ZonedDateTime.of( 2016 , 1 , 2 , 12 , 0 , 0 , 0 , zoneId ); // Noon on Jan 2 in Iran.
UTC 的Instant
使用数据库切换到UTC。 Instant
是UTC时间轴上的一个时刻,分辨率为纳秒。我们可以从上面讨论的任何一个日期时间对象中提取Instant
对象。
Instant instant = odt.toInstant();
Instant instant = zdt.toInstant();
如果您的JDBC驱动程序符合JDBC 4.2(Daylight Saving Time (DST),JSR 221,Guide),您可以直接使用Instant
对象传递给{{ 3}}在java.sql package上。
myPreparedStatement.setObject( instant , 1 );
如果这对JDBC驱动程序不起作用,请回退使用旧的java.sql
类型。对于日期时间,这意味着setObject
及其PreparedStatement
方法。
java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
myPreparedStatement.setTimestamp( ts , 1 );