用户时区中的日期时间转换

时间:2013-12-30 12:54:16

标签: java android sqlite timezone simpledateformat

我在 sqlite数据库中的某个记录的某个日期字段以某种格式保存。

要将此日期列转换为特定格式,我会进行一些日期格式化,并使用以下代码将其添加到数组dbDates中 -

SimpleDateFormat dateIn = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

dbDates.add(dateIn.format(formatter.parse("2013-12-16T02:00:00.000Z");
dbDates.add(dateIn.format(formatter.parse("2013-12-15T01:30:00.000Z");

在控制台中打印的dbDates现在采用以下格式 -

Mon Dec 16 02:00:00 GMT+05:30 2013

Sun Dec 15 01:30:00 GMT+05:30 2013

注意:注意到,在每个dbDate的末尾添加了+05:30

当我将其转换为用户时区时,这会导致问题。

添加此行----

dateIn.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));  

将输出更改为 -

Sun Dec 15 12:30:00 PST 2013
Sun Dec 14 12:00:00 PST 2013

但是,正确的输出应为:

Sun Dec 15 18:00:00 PST 2013

Sun Dec 14 17:30:00 PST 2013

因此,输出有+05:30的差异。怎么解决?

1 个答案:

答案 0 :(得分:0)

与Java捆绑在一起的java.util.Date类在实例中没有定义时区。然而,它的toString方法使用JVM的默认时区呈现字符串。我敢打赌你的JVM设置为印度时区,给出+05:30。

这是避免使用java.util.Date/Calendar类的众多原因之一。众所周知,它们在设计和实施方面都很糟糕。

立即为您自己下载Joda-Time库的副本。将其用于所有业务逻辑和计算。

在Joda-Time中,DateTime实例确实知道自己的时区。

必要时处理其他类,通过调用DateTime实例上的toDate方法转换为j.u.Date。

在StackOverflow.com上搜索joda,找到很多例子。

在Java 8中,要么继续使用Joda-Time,要么切换到JSR 310定义的新java.time。*类。新类的灵感来自Joda-Time,但完全重新构建。