我在 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的差异。怎么解决?
答案 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,但完全重新构建。