首页 > 解决方案 > java - 如何更改从java中的数据库接收到的日期时间的显示格式

问题描述

我使用此代码将 util 更改为 sql,但记录发生在秒和另一个值之后

String insertAttendence = null;
insertAttendence = "INSERT INTO ATTENDANCE (PRSN_ID,DATE,ARRIVAL,DEPART,DATE_ARRIVAL_FROM,DATE_DEPARTURE_TO) VALUES (?,?,?,?,?,?)";
PreparedStatement psAttendence = null;

psAttendence = dbConnection.prepareStatement(insertAttendence);
psAttendence.setInt(1, personIdForGraphics.intValue());
java.sql.Date sqlDate = new java.sql.Date(dates.get(i).getTime());               
psAttendence.setDate(2, sqlDate);

在数据库中保存为2019-07-26 11:53:18.0,我想保存为2019-07-26 11:53:18,怎么改?

标签: javasqlswingdate

解决方案


你不想

您不希望datetime数据库中的 具有特定格式。除了最简单的一次性程序外,其他所有程序的良好做法是将用户界面与数据模型分开。datetime属于你的模型的价值,所以保持你datetime在那里,永远不要让用户直接看到它。当您坚持这一点时,datetime数据库中的格式就无关紧要了。每当用户应该看到日期时,将其格式化为 aString并向用户显示字符串。同样,如果您需要特定格式与另一个系统进行交换,请为此目的将日期时间格式化为字符串。如果用户需要输入日期和/或时间,要么接受字符串,要么使用日期选择器或时间选择器。

你不能

正如@GuidoG 在评论中已经说过的那样,日期时间以某种我们不知道也不应该关心的内部格式存储在数据库中。肯定不是2019-07-26 11: 53: 18.0你报的那个。您可能已经在某些查询工具中看到过,或者由于从数据库中检索日期时间作为字符串的结果,我不知道。也可能是您可以配置查询工具以向您显示不同的格式。您可以datetime将数据库中的 视为一天中的日期和时间,仅此而已。

简而言之,“格式”仅适用于日期时间的字符串表示,而不适用于日期时间本身。

java.time 和 JDBC 4.2

您使用的java.sql.Date课​​程设计不佳且早已过时。此外,您的 JDBC 驱动程序应该将其视为没有时间的日期,并且大多数 JDBC 驱动程序都这样做(因此,您如何让代码以非零时间存储2019-07-26 11: 53: 18.0 有点奇怪)。

假设您要存储一个时间点(时间戳),请将您的数据库列更改为数据类型timestamp with time zone,然后将一个存储OffsetDateTime到其中。我假设这dates.get(i).getTime()给了你自纪元以来的毫秒数。

    OffsetDateTime dateTimeToSave = Instant.ofEpochMilli(dates.get(i).getTime())
            .atOffset(ZoneOffset.UTC);
    psAttendence.setObject(2, dateTimeToSave);

如果您无法更改数据类型,您可以LocalDateTime使用相同的方式将 a 存储到数据库列psAttendence.setObject中,但您必须确保自己LocalDateTime在正确的时区获得 a,因为对象本身既不包含时区也不包含偏移量。建议使用 UTC。

教程链接: Oracle 教程:日期时间解释如何使用 java.time。


推荐阅读