我在流中以字符串形式获取时间戳,它们的格式为 "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 并且与输入时间相同?
最佳答案
Java 的 java.util.Date
和 java.sql.Timestamp
不存储时区。
他们总是跟踪UTC时间。
当解析包含时区的日期字符串时,该字符串会被正确解析并从给定时区调整为 UTC。
在解析没有时区的日期字符串时,该字符串将在 JVM 的默认时区中进行解析并转换为 UTC,除非已向日期解析器显式指定另一个时区(通常为 SimpleDateFormat
)。
当显示(也称为格式化)日期
/时间戳
时,除非另有指定,否则它将以 JVM 的默认时区显示。
Date
/Timestamp
对象无法存储时区,因此它们无法记住原始时区是什么。
如果您需要,请使用 Java 8 的 ZonedDateTime
。
关于java - SimpleDateFormat 解析根据时区改变时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41054528/