我有一个这样的数据库,其中lastEdited
是date
字段。
我使用" RESTFUL来自数据库的Web服务"
将此数据库连接到Java Web应用程序这会自动为我的THREADCHAT
列生成一个名为ThreadChat的类。这里给出的是lastEdited部分的getter和setter。
lastEdited是一个java.util.Date对象。
public Date getLastedited() {
return lastedited;
}
public void setLastedited(Date lastedited) {
this.lastedited = lastedited;
}
在这里,我正在创建一个新的ThreadChat对象并将数据添加到数据库中。 lastEdited的参数是java.util.Date对象。
ThreadChat thread = new ThreadChat(threadName, new Date(), loginIdInt);
threadChatFacadeREST.create(thread);
这会像这样更新表格。
此方法返回THREADCHAT表中的所有记录。
List<ThreadChat> list = getAllThreads();
但是,getLastEdited()
会返回XMLGregorianCalender
个对象而不是Date
个对象,就像上面的getter方法一样。
如果我将这个对象打印到控制台,那么日期部分就在那里,但我每次都会得到00:00的分钟和小时部分。
2018-04-10T00:00:00+05:30
如何在JDBC数据库中存储Date + Time并检索它们?
答案 0 :(得分:2)
您的数据库中的字段类型为DATE
,因此DATE
仅存储YYYY-MM-DD
。
如果您还要存储时间,则必须将数据库中字段的类型更改为DATETIME
。这表示为:YYYY-MM-DD HH:MI:SS
答案 1 :(得分:1)
您正在寻找DATA_TYPE TIMESTAMP。如果可以,您应该更改数据库。
答案 2 :(得分:1)
您使用仅限日期type来保存日期时间值 - 尝试适合square peg into a round hole。
如何在JDBC数据库中存储Date + Time并检索它们?
要存储片刻,日期时间值,请使用日期时间类型:
TIMESTAMP WITH TIME ZONE
。Instant
。 您正在使用非常混乱的遗留类。仅使用 java.time 类。
数据库的日期时间data types及其行为差异很大。您没有指定数据库,因此我们只能猜测或遵守SQL standard。
遗憾的是,SQL标准几乎没有触及日期时间处理的主题。该标准简要定义:
DATE
作为仅限日期的值,没有时间。 TIMESTAMP WITHOUT TIME ZONE
是日期和时间,但缺少任何时区概念或偏离UTC的概念,因此不代表实际时刻。 TIMESTAMP WITH TIME ZONE
。该类型名称可能会产生误导,因为某些实现(如Postgres)不会存储带有值的区域,而是使用任何传递的区域信息调整为UTC值进行存储。您使用的是最早版本的Java中可怕的旧日期时间类。这些在Java 8及更高版本中被 java.time 类取代。切勿再次使用Date
或Calendar
。
除非业务逻辑或用户界面明确要求,否则通常最好在UTC中思考,工作,存储,记录和交换日期时间值。所以通常你应该关注Instant
类。 Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。此课程取代java.util.Date
。
捕获UTC中的当前时刻。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
将此Instant
存储在SQL标准类型TIMESTAMP WITH TIME ZONE
的数据库列中,或类似于特定数据库中的任何内容。
从JDBC 4.2及更高版本开始,您可以直接与数据库交换 java.time 对象。
myPreparedStatement.setObject( … , instant ) ;
检索。
Instant instant = myResultSet.getObject( … , Instant.class ) ;
如果提交过时的XMLGregorianCalendar
,请立即通过过时的GregorianCalendar
类转换为 java.time ZonedDateTime
。
ZonedDateTime zdt = myXmlGregCal.toGregorianCalendar().toZonedDateTime() ; // Convert from legacy classes to modern java.time class.
如果您希望在UTC中看到同一时刻而不是该特定区域(时区)的人使用的挂钟时间,请提取Instant
。
Instant instant = zdt.toInstant() ; // Adjust from zoned moment to UTC. Same moment, same point on the timeline, different wall-clock time.
如果您必须与尚未更新为 java.time 的旧代码进行互操作,则可以来回转换。提示:尽量保持在 java.time 中。遗留类是糟糕的设计混乱。
java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ;
而且,走向另一个方向。
Instant instant = myJavaUtilDate.toInstant() ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。