我有一个需要了解时区的 Java 应用程序。当我采用 Unix 纪元时间并尝试将其转换为用于 Oracle SQL 调用的时间戳时,它正在获取正确的时区,但时区“useDaylightTime”值不正确,即当前返回“true” ,当我们不在 DST 时(我在佛罗里达州的 TZ“America/New_York”)。
这是在 Red Hat Linux Enterprise 6 上运行的,据我所知,它已正确设置为时区,例如“日期”返回:Wed Nov 28 12:30:12 EST 2012
我还可以看到,使用“zdump”实用程序,“isdst”的当前值为 0。
我的 Java 版本是 1.6.0_31。
我已经用谷歌搜索了这个并看到了这导致的许多问题,但他们中的许多人只是说手动设置 TZ,但我的问题不是 TZ,而是默认 TZ 将“isDaylight”设置为“true”这一事实. 我相信这导致我的查询返回一个小时后的数据(我可以看到它是)。
这是我运行的一个简单的代码片段,试图以最简单的方式重现它:
public class TZdefault {
public static void main(String[] args) throws IOException {
long startTime = System.currentTimeMillis()/1000;
Calendar start = Calendar.getInstance();
start.setTimeInMillis(startTime);
start.setTimeZone(TimeZone.getDefault());
System.out.println("Start UTC: " + start + "ms: " + start.getTimeInMillis());
System.out.println("use daylight: " + start.getTimeZone().useDaylightTime());
} // end main
} // end class
最后一件事。如果在我的代码中我将 TZ 设置为“EST”,它当然会返回一个将“isDaylight”设置为 False 的 TZ。但这不是一个好的解决方案。
我想添加一些我一直希望隐藏的细节。
我在使用 TIMESTAMP 和 TIMEZONE 字段的 Oracle 11g 数据库中有记录。我只是在做 JDBC 查询,其中两个参数使用 BETWEEN 开始时间戳和结束时间戳。
当我查询此表时,我使用的是使用日历条目的准备好的语句,其唯一目的是尝试和操作时区。最重要的是,在应用“默认”时区后,我正在使用“getTimeInMillis”方法对开始和结束时间进行 pstmt.setTimestamp() 调用。日志输出显示,实际上它输入了正确的毫秒数,但返回的 SQL 结果显然相差一小时!
我仍在尝试验证数据插入方面是否也没有问题。
但是我有很多调试信息,看起来我在 JDBC 查询中要求正确的时间。