java - SimpleDateFormat 解析根据时区改变时间

标签 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 并且与输入时间相同?

最佳答案

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

他们总是跟踪UTC时间。

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

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

显示(也称为格式化)日期/时间戳时,除非另有指定,否则它将以 JVM 的默认时区显示。

Date/Timestamp 对象无法存储时区,因此它们无法记住原始时区是什么。

如果您需要,请使用 Java 8 的 ZonedDateTime

关于java - SimpleDateFormat 解析根据时区改变时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41054528/

相关文章:

java - 如何使抽屉导航阴影变浅

java - liferay 7.2 中的 Spring Autowiring 注释

python - Pandas 日期时间格式

python - 重新采样 Pandas 列日期时间

Javascript 将 DateTime 转换为 "______ seconds/minutes/hours/months ago"

Oracle - 从 DATE 数据类型字段中获取以毫秒为单位的日期/时间

java - Spring PUT 请求 : Unsupported Media Type (Code: 415)

java - 将 SimpleDateFormatter 与时区一起使用时出现意外结果

sql - 标记个人事件发生后发生的日期

java - 从 java.awt.geom.GeneralPath 中删除一个点/操作