gpt4 book ai didi

java - 为什么在使用 SimpleTimeZone 时 java 的 SimpleDateFormat 从我的 UTC 日期中减去 1 秒

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:15 29 4
gpt4 key购买 nike

有人可以解释为什么在使用 SimpleTimeZone 设置时区时 SimpleDateFormat 会在我解析的日期上减去 1 秒吗?

这是 jdk 的错误吗?

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.SimpleTimeZone;
import java.util.TimeZone;

public class SimpleDateFormatTest {

public static void main(String[] args) throws ParseException {

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

format.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(format.parse("2016-02-24T17:31:00Z"));
// prints Wed Feb 24 17:31:00 UTC 2016

format.setTimeZone(new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC"));
System.out.println(format.parse("2016-02-24T17:31:00Z"));
// Wed Feb 24 17:30:59 UTC 2016
}

}

最佳答案

您没有正确使用构造函数。

SimpleTimeZone 的构造函数定义为:

public SimpleTimeZone(int rawOffset,
String ID)

Constructs a SimpleTimeZone with the given base time zone offset from GMT and time zone ID with no daylight saving time schedule.

Parameters:

rawOffset - The base time zone offset in milliseconds to GMT.

ID - The time zone name that is given to this instance.

因此,构造函数的第一个参数是您要创建的时区与 GMT 的时差,以毫秒为单位。

没有理由在这里使用任何常量STANDARD_TIMEUTC_TIMEWALL_TIME。这不是使用它们的地方。但是,因为这些常量是 int 类型,并且 rawOffset 参数是 int 类型,所以 Java 不会阻止您错误地传递这些常量给构造函数。

在Java源码中,这个常量定义为:

public static final int UTC_TIME = 2;

所以当你调用时你实际上在做什么

new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC")

意思是“请创建一个距格林威治标准时间 2 毫秒的时区,并将其命名为‘UTC’”。我很确定这不是您想要实现的目标。这是一个自定义时区,与 UTC 略有不同,这种差异在您的输出中四舍五入为整秒。

关于java - 为什么在使用 SimpleTimeZone 时 java 的 SimpleDateFormat 从我的 UTC 日期中减去 1 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28107900/

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