【发布时间】:2017-07-09 20:46:40
【问题描述】:
我发现了一个关于 Java DST 更改的问题。 当 DST(夏令时)发生的确切时刻,该特定时间可能会出现两次。
例如,对于时区 America/Sao_Paulo,它从 2016 年 2 月 21 日星期日 00:00:00 向后更改一小时到 2016 年 2 月 20 日星期六 23:00:00。 当天 23:00 时间出现两次。
在我的用例中,我想进行第二次。例如,当我想要这一天的数据时,我实际上是指完整的这一天(即使它可能包含 25 小时)。
但在我看来,Java 似乎占据了这一刻的第一次。
例子:
@Test
public void testDSTChange() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
TimeZone tz = TimeZone.getTimeZone("America/Sao_Paulo");
long dateInput = sdf.parse("2016-02-20T23:00:00").getTime();
long dateUTC = dateInput - tz.getOffset(dateInput);
long dateInput2 = sdf.parse("2016-02-21T02:00:00").getTime();
long dateUTC2 = dateInput2 - tz.getOffset(dateInput2);
System.out.println("Difference: " + (dateUTC2 - dateUTC) / 3600 / 1000);
}
在这个例子中,它显示这两个日期之间的差异是 4 小时,而不是我预期的 3 小时。所以我想知道是否还有其他方法可以做到这一点?
【问题讨论】:
-
我不太清楚你的问题。您希望当天的时间不受小时变化的影响吗?
-
不,我想要 DST 更改后的时间。在我的示例中, 2016-02-20T23:00:00 实际上当天发生了两次,我想采取第二次,即 DST 更改后的一次。
-
你能用 Joda Time 或 Java 8 代替
java.util.Date和java.util.Calendar吗? -
Java 8 发生了什么变化?
-
@Tony - 很多! docs.oracle.com/javase/8/docs/api/java/time/…