gpt4 book ai didi

java - Java夏令时的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:02:38 26 4
gpt4 key购买 nike

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

它在 Red Hat Linux Enterprise 6 上运行,据我所知,它正确设置了时区,例如“日期”返回: 2012 年 11 月 28 日星期三 12:30:12 EST

我还可以看到,使用“zdump”实用程序,“isdst”的当前值为 0。

我的 Java 版本是 1.6.0_31。

我用谷歌搜索了这个并看到了这导致的许多问题,但其中很多只是说要手动设置 TZ,但我的问题不是 TZ,而是默认 TZ 将“isDaylight”设置为'真的'。我相信这会导致我的查询返回一小时后的数据(我可以看到它是)。

这是我运行的一段简单代码,试图以最简单的方式重现它:

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。但这不是一个好的解决方案。

我想添加一些我一直希望隐藏的更多细节。

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

当我查询此表时,我正在使用一个使用日历条目的准备语句,其唯一目的是尝试操作时区。最重要的是,在应用“默认”时区后,我正在使用“getTimeInMillis”方法调用 pstmt.setTimestamp() 作为开始和结束时间。日志输出显示实际上它输入了正确的毫秒数,但返回的 SQL 结果明显偏差了 1 小时!

我仍在尝试验证数据插入端是否也没有问题。

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

最佳答案

the timezone useDaylightTime value is not correct, i.e., it is currently returning "true", when we are NOT in DST

我认为您混淆了 useDaylightTimeinDaylightTime。前者告诉您 future 是否有夏令时和标准时间之间的转换,而不是您处于转换的哪一侧。例如,它对中国时区返回 false,因为中国不调整夏令时,但它对大多数美国时区返回 true,因为美国大多数州(Arizona 除外)都遵守夏令时。

inDaylightTime

public abstract boolean inDaylightTime(Date date)

Queries if the given date is in Daylight Saving Time in this time zone.

对比

useDaylightTime

public abstract boolean useDaylightTime()

Queries if this TimeZone uses Daylight Saving Time. If an underlying TimeZone implementation subclass supports historical and future Daylight Saving Time schedule changes, this method refers to the last known Daylight Saving Time rule that can be a future prediction and may not be the same as the current rule. Consider calling observesDaylightTime() if the current rule should also be taken into account.

关于java - Java夏令时的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13611108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com