有人可以解释为什么在使用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)
构造一个SimpleTimeZone,其给定的基准时区与GMT的偏移量以及时区ID没有夏令时时间表。
参数:
rawOffset
-与GMT的基本时区偏移量(以毫秒为单位)。
ID
-赋予该实例的时区名称。
因此,构造函数的第一个参数是您要创建的时区与GMT的时差(以毫秒为单位)。
没有理由使用任何常量STANDARD_TIME
,UTC_TIME
或者WALL_TIME
在这里。这不是使用它们的地方。但是,由于这些常量的类型为int
,而rawOffset
参数的类型为int
,因此Java不会阻止您将这些常量错误地传递给构造函数。
在Java源代码中,此常量定义为:
public static final int UTC_TIME = 2;
所以打电话时你实际上在做什么
new SimpleTimeZone(SimpleTimeZone.UTC_TIME, "UTC")
说“请创建一个距格林尼治标准时间2毫秒的时区,并将其称为'UTC'”。我很确定这不是您要实现的目标。这是一个自定义时区,与时区略有不同UTC
,并且此差异在输出中四舍五入至整秒。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句