gpt4 book ai didi

java - 从 java.sql.Timestamp 获取公历日期

转载 作者:行者123 更新时间:2023-12-01 12:47:49 25 4
gpt4 key购买 nike

我已经向实体管理器执行了查询。
它从多个表返回数据。在那种情况下,我会得到对象数组的列表。所以我写了一个循环如下。

for (Object[] row : rows) {
row[0]; //row[0] has the date from database as timestamp.
}

这里 row[0]是一个 sql 时间戳。
如果我们通过调试进行评估,我会得到时间戳,结果为: 2020-05-27 18:37:39.0 .

我可以看到 cdate ,一个私有(private)变量,其值为 2020-05-27T18:37:39.000+0530 .这是公历日期。
我不能使用它,因为它是一个私有(private)变量,它的类型是 BaseCalendar.Date .

如果您做某事并将其转换为 UTC,我将得到 2020-05-27T13:07:39Z
但我希望它为 2020-05-27T18:37:39.000+0530

最佳答案

我也建议您使用现代 Java 日期和时间 API java.time。如果可以,请修改您的查询以不返回老式的 Timestamp对象,而是一个 Instant或至少一个 LocalDateTime .

然后你可以做例如:

    // Example row
Object[] row = { Instant.parse("2020-05-27T13:07:39.000Z") };
System.out.println(row[0]);

ZonedDateTime zdt = ((Instant) row[0]).atZone(ZoneId.systemDefault());
System.out.println(zdt);

此示例的输出是,在亚洲/加尔各答时区运行时:

2020-05-27T13:07:39Z
2020-05-27T18:37:39+05:30[Asia/Kolkata]


如果您无法更改查询的返回类型,则正确的转换是:
    // Example row
Object[] row = { Timestamp.from(Instant.parse("2020-05-27T13:07:39.000Z")) };
System.out.println(row[0]);

ZonedDateTime zdt = ((Timestamp) row[0]).toInstant()
.atZone(ZoneId.systemDefault());
System.out.println(zdt);

输出是:

2020-05-27 18:37:39.0
2020-05-27T18:37:39+05:30[Asia/Kolkata]


请注意:不要使用任何字符串进行转换,存在更直接的转换。

我假设您使用的是该值,不一定使用您在调试器中看到的相同格式。如果您确实需要这种格式:您看到的是 BaseCalendar.Date.toString() 的结果,它是国际标准 ISO 8601 格式的变体。要获得它,请使用格式化程序。例如:
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral('T')
.appendPattern("HH:mm:ss.SSSxx")
.toFormatter();
String formattedDateTime = zdt.format(formatter);
System.out.println(formattedDateTime);

2020-05-27T18:37:39.000+0530


链接
  • Oracle tutorial: Date Time解释如何使用 java.time。
  • Wikipedia article: ISO 8601
  • 关于java - 从 java.sql.Timestamp 获取公历日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62387889/

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