相关疑难解决方法(0)

Java夏令时的问题

我有一个需要了解时区的Java应用程序.当我获取Unix纪元时间并尝试将其转换为用于Oracle SQL调用的时间戳时,它获得了正确的时区,但时区"useDaylightTime"值不正确,即它当前返回"true" ,当我们不在夏令时(我在佛罗里达州的TZ"America/New_York").

这是在Red Hat Linux Enterprise 6上运行的,据我所知,它正确设置为时区,例如'date'返回: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
Run Code Online (Sandbox Code Playgroud)

最后一件事.如果在我的代码中我将TZ设置为"EST",它当然返回一个TZ,其中'isDaylight'设置为False.但这不是一个好的解决方案.

我想添加一些我一直希望隐藏的细节.

我在Oracle 11g数据库中有记录,它使用TIMESTAMP和TIMEZONE字段.我只是在进行JDBC查询,其中两个参数使用BETWEEN开始时间戳和结束时间戳.

当我查询这个表时,我正在使用一个使用Calendar条目的预准备语句,其唯一目的是尝试操作时区.底线是我在应用"默认"时区后的开始和结束时间使用'getTimeInMillis'方法进行pstmt.setTimestamp()调用.日志输出显示实际上它正在输入正确的毫秒数,但返回的SQL结果显然已经完全关闭了一个小时!

我仍然试图验证数据插入方面也没有问题.

但是我有很多调试信息,看起来我在JDBC查询中要求正确的时间.

java timezone dst

7
推荐指数
2
解决办法
2万
查看次数

标签 统计

dst ×1

java ×1

timezone ×1