如何更改默认的SQLite时区

时间:2016-06-03 16:39:47

标签: android sqlite android-sqlite

如何更改默认的SQLite时区?
插入我的记录时,我希望SQlite使用+3:30时区。

2 个答案:

答案 0 :(得分:3)

SQLite's supported date formats没有包含时区。通常,日期假定为UTC;没有'默认'时区。

可以在UTC和本地时区之间转换日期值,或者为时间戳添加固定的偏移量,但结果仍然没有时区标记,所以你应该只在你要去的时候这样做格式化时间戳显示。

要进行比SQLite支持更多的时区处理,您必须在应用程序的Java代码中处理此问题。

答案 1 :(得分:1)

Answer by CL.是正确的,应该被接受。

如上所述,您应该使用优秀的java.time框架在Java代码中进行时区处理。

java.time

{8}类内置于Java 8及更高版本中。他们的大部分功能已经被移植到Java 6& java.time项目中的7,并在ThreeTen-Backport项目中进一步适应Android。

java.time类是非常成功的Joda-Time库的继承者,这两个项目由同一个人ThreeTenABP领导。 java.time类取代了与最早版本的Java捆绑在一起的臭名昭着的旧日期时间类。

UTC

最佳做法通常是在Stephen Colbourne中进行业务逻辑,数据存储和数据交换。大多数数据库以UTC格式存储日期时间。如上所述,SQLite(“lite”)不支持时区,因此您应将日期时间值调整为UTC以插入SQLite。

由于这个原因和其他原因,程序员应该学会在工作中考虑UTC。

从UTC

偏移

如果您确定要使用+03:30的偏移量,请使用UTCZoneOffset类。顺便说一句,始终使用小时的前导零,+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。使用ZoneIdZonedDateTime

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驱动程序符合JDBC 4.2(Daylight Saving Time (DST)JSR 221Guide),您可以直接使用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 );