gpt4 book ai didi

java - 更改 Java 时间戳格式会导致时间戳发生更改

转载 作者:行者123 更新时间:2023-11-29 04:18:20 25 4
gpt4 key购买 nike

我对 Java 时间戳格式化函数感到有点困惑,因为它们似乎将时间戳更改了几分钟。

我的 Pivotal CloudFoundry 应用程序将一个新条目写入 PostgreSQL 9.4.5 数据库。为此,我让 PostgreSQL 为该条目生成并存储一个时间戳(在 SQL 语句中,我为该特定列使用“now()”)。到目前为止一切正常。当我用我的应用程序读取条目时出现问题,因为我必须将时间戳格式化为 ISO 8601(公司政策),这似乎改变了时间戳。我用过这段代码:

public String parseTimestamp(String oldDate) {
System.out.println("String oldDate: " + oldDate);

TimeZone timeZone = TimeZone.getTimeZone("Europe/Berlin");
SimpleDateFormat oldDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSS");
SimpleDateFormat newDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
newDateFormat.setTimeZone(timeZone);

Date tempDate = null;
try {
tempDate = oldDateFormat.parse(oldDate);
} catch (ParseException e) {
//TODO
}

System.out.println("tempDate before format(): " + tempDate);
String newDate = newDateFormat.format(tempDate);
System.out.println("tempDate after format(): " + tempDate);
System.out.println("String newDate: " + newDate);
return newDate;
}

输出:

String oldDate: 2018-06-18 13:07:27.624828+02
tempDate before format(): Mon Jun 18 13:17:51 CEST 2018
tempDate after format(): Mon Jun 18 13:17:51 CEST 2018
String newDate: 2018-06-18T13:17:51Z

如您所见,时间戳从 13:07 更改为 13:17。所有其他查询的条目也显示出差异,在大约 2 到 10 分钟之间变化。但是,当我重新运行查询时,每个差异都保持不变。 OP 告诉我所有涉及的系统都有同步时间,我不确定系统时间是否应该在这里发挥作用。

有人知道这是怎么回事吗?

最佳答案

首先,我真的很困惑,我想,您可能在 SimpleDateFormat 中发现了某种错误。您的代码可以简化为以下几行以显示相同的行为:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSS");
String str = "2018-06-18 13:07:27.624828+02";
System.out.println(str);
System.out.println(format.parse(str));

结果:

2018-06-18 13:07:27.624828+02
Mon Jun 18 13:17:51 CEST 2018

解析的 Date 对象多了十分钟(几秒)。

仔细观察会发现问题 - 这不是 JDK 中的错误:

您的毫秒部分是 624828 - 这些是六位(!)数字(不是三位)。 624828毫秒约合624秒,即10分24秒。SimpleDateFormat 正确地总结了这额外的秒数和分钟数。

还有什么问题:您的日期格式包含五位数的毫秒部分。

解决方案:

(新)Java Time API可以处理更大的秒数 - 并且还可以在不同时区之间轻松转换:

String str = "2018-06-18 13:07:27.624828+02";
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSx");
OffsetDateTime date = OffsetDateTime.parse(str, pattern);
System.out.println(date);
System.out.println(date.withOffsetSameInstant(ZoneOffset.UTC));

结果:

2018-06-18T13:07:27.624828+02:00
2018-06-18T11:07:27.624828Z

关于java - 更改 Java 时间戳格式会导致时间戳发生更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50908447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com