【问题标题】:SimpleDateFormat parse is changing time according to timezone [duplicate]SimpleDateFormat 解析正在根据时区更改时间 [重复]
【发布时间】:2016-12-09 06:42:47
【问题描述】:

我在流中以字符串形式获取时间戳,它们的格式为 "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 datetime timestamp


    【解决方案1】:

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

    他们总是以 UTC 跟踪时间。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      解析日期时必须忽略时区

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-21
        • 2013-04-13
        相关资源
        最近更新 更多