SimpleDateFormat解析根据时区更改时间

时间:2016-12-09 06:42:48

标签: java datetime timestamp

我将时间戳作为流中的字符串获取,格式为"2016-12-08 05:44:48 <timezone like IST, UTC>""2016-12-08 05:44:48 <timezone like +0000>"

我想将字符串转换为java.sql.Timestamp,所以我写了一个函数,如下所示

private static Timestamp convertToTimestamp(String s) throws ParseException{
    String dateFormat = new String("yyyy-MM-dd hh:mm:ss z");
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    Date d = sdf.parse(s);
    return new Timestamp(d.getTime());
}

当我跑步时

Timestamp t = convertToTimestamp("2016-12-08 05:44:48 UTC");
System.out.println(t);

输出为2016-12-08 11:14:48.0

它会自动转换为IST(可能是我的JVM默认值)。 如何进行更改以使输出时间不会更改为IST并与输入相同?

2 个答案:

答案 0 :(得分:1)

解析日期时必须忽略时区

new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

答案 1 :(得分:1)

Java java.util.Datejava.sql.Timestamp不存储时区。

他们始终以 UTC 跟踪时间。

在解析包含时区的日期字符串时,字符串会被正确解析并从给定时区调整为UTC。

在解析没有时区的日期字符串时,该字符串将在JVM的默认时区中解析并转换为UTC,除非已向日期解析器明确指定了另一个时区(通常为SimpleDateFormat)。

显示(也称为格式化)Date / Timestamp时,除非另有说明,否则它将显示在JVM的默认时区中。

Date / Timestamp个对象无法存储时区,因此他们无法记住原始时区的内容。

如果您需要,请使用Java 8&#39 {s} {/ 1}}。