从java.sql.timestamp获取公历日期

h5qlskok  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(313)

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

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 ,一个私有变量,其值为 2020-05-27T18:37:39.000+0530 . 今天是公历日。我不能使用它,因为它是一个私有变量,并且类型为 BaseCalendar.Date .
如果你做了一些事情,并将其转换为utc,我将得到 2020-05-27T13:07:39Z 但我想把它当作 2020-05-27T18:37:39.000+0530

fykwrbwg

fykwrbwg1#

使用现代日期/时间api,如下所示:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String args[]) {
        // Define the format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

        // Parse the date/time string using the defined format
        OffsetDateTime odt = OffsetDateTime.parse("2020-05-27T18:37:39.000+0530", formatter);

        // Display
        System.out.println(odt);
    }
}
tmb3ates

tmb3ates2#

我也建议您使用java.time,即现代的java日期和时间api。如果可以,请修改查询以不返回老式的 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() ,它是国际标准ISO8601格式的变体。要获取它,请使用格式化程序。例如:

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教程:date time解释如何使用java.time。
维基百科文章:iso 8601

neekobn8

neekobn83#

你可以利用 java.time ,它使您能够在不考虑区域或偏移量的情况下解析datetime,但提供了在不更改或调整解析值的情况下随后添加区域或偏移量的可能性:

public static void main(String[] args) {
    // let's assume you have a timestamp with the following value
    Timestamp ts = Timestamp.valueOf("2020-05-27 18:37:39");
    // then you can parse it to a datetime that doesn't consider a zone or offset
    LocalDateTime ldt = LocalDateTime.parse(ts.toString(),
                            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));
    // print it once
    System.out.println(ldt);
    // then add an offset without changing / adjusting the time values
    OffsetDateTime odt = ldt.atOffset(ZoneOffset.of("+05:30"));
    // and print that
    System.out.println(odt);
    // or use a default format to exactly meet your requirements
    System.out.println(odt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX")));
}

这个输出

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

相关问题