SimpleDateFormat解析不遵守时区

时间:2015-11-04 14:18:49

标签: java datetime simpledateformat

public static void main(String[] args) throws ParseException {
    SimpleDateFormat dt = new SimpleDateFormat("MM dd yy");
    dt.setLenient(false);
    dt.setTimeZone(TimeZone.getTimeZone("Asia/Hong_Kong"));
    Date date = dt.parse("05 14 16");
    System.out.println(date);
}

输出: Fri May 13 21:30:00 IST 2016

如果我尝试使用输出,它将切换到前一天而不是正确的一天。

这是预期的还是API的问题?

1 个答案:

答案 0 :(得分:3)

这是预期的,Java中没有错误。

班级Date不包含时区信息。自格林威治标准时间01-01-1970 00:00:00以来,java.util.Date只不过是包装了几毫秒。它不记得它解析的字符串包含有关时区的信息。

当您在此处显示Date时,例如通过(隐式)调用toString()

System.out.println(date);

它将以您系统的默认时区打印,在您的情况下为IST。

如果要在特定时区打印,请使用SimpleDateFormat对象对其进行格式化,在SimpleDateFormat对象上设置所需的时区。例如:

DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss Z");
df..setTimeZone(TimeZone.getTimeZone("Asia/Hong_Kong"));
System.out.println(df.format(date));