Date.toString() - sql vs util date

时间:2011-11-23 13:16:00

标签: java date jdbc simpledateformat

我需要从Date对象中删除时间。这是我的尝试,

代码:

System.out.println("date " + dbDate);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("formatter.format(dbDate) " + formatter.format(dbDate));
System.out.println("final " + formatter.parse(formatter.format(dbDate)));

输出:

date 2011-12-03 23:59:59.0
formatter.format(dbDate) 2011-12-03
final Sat Dec 03 00:00:00 IST 2011

我希望在2011-12-03中显示最终日期。但转换后toString() Date的格式不同。我错过了什么。请帮忙。

更新

在我的应用程序中,我有两种不同的方法来获取dbDateEXPIRY_DATE列的类型为DATE

首次查询使用dbDate = (java.util.Date) rs.getDate("EXPIRY_DATE");

对于此dbDateSystem.out.println("date " + dbDate);提供了date 2011-12-03

第二个查询使用dbDate = rs.getTimestamp("EXPIRY_DATE");

对于此dbDateSystem.out.println("date " + dbDate);提供了date 2011-12-03 23:59:59.0

这是我的问题。正如我认为toString()提出了问题,我没有提到完整的问题。

解决方案:

由于我的应用方法有多种用法,我无法避免java.sql.Date。 我尝试了下面的工作,

dbDate = new java.sql.Date(dbDate.getTime());

5 个答案:

答案 0 :(得分:4)

  

我需要从日期对象中删除时间

你做不到。 java.util.Date对象包含日期和时间。其toString()也位于a fixed format。如果您想在没有时间的情况下代表人类,那么您需要将其转换为String,就像您已经做过的那样。或者,如果您打算在没有时间的情况下将其存储在数据库中(因为变量名db中的dbDate部分建议),那么您需要将其转换为java.sql.Date

preparedStatement.setDate(1, new java.sql.Date(dbDate.getTime()));
// ...

根据您的更新

更新ResultSet#getDate()会返回java.sql.Date的实例,而不是java.util.Date(但它是java.util.Date的子类,这就是为什么不必要的演员工作;请注意,演员与转换不同,真正的转换将是new java.util.Date(dbDate.getTime()))。正如您可以阅读toString() java.sql.Date yyyy-MM-dd方法的the javadoc一样,它确实是java.sql.Date格式。

因此,您的具体问题是,您java.util.Datejava.util.Date混淆,并且您错误地理解toString()的内部运作并被{{1}}误导方法。一切都是有意为之。

相关:

答案 1 :(得分:1)

如果您要执行的操作是删除Date对象的时间部分:

如果您只想获得String表示而没有Date对象的时间部分:

  • 您必须使用SimpleDateFormat.format()。您无法让Date.toString()返回不同的值,它将始终使用该模式。看看它的source code

答案 2 :(得分:0)

当您上次致电formatter.parse()时,您会收到Date个对象;然后,串联对Date.toString()进行隐式调用:此调用返回的格式是JVM中设置的语言环境的默认格式。 您必须了解的是Date对象不知道字符串表示,在内部它只是inte的集合

答案 3 :(得分:0)

我遇到类似的问题,遇到与我相同的问题,我写这个条目:

问题是从数据库获取并传递给Web客户端的日期值格式为yyyy-mm-dd,但在第一个条目的应用程序中没有数据库值,因此我们创建日期对象并传递值到web客户端,它给我们时间戳值。将传递给Web客户端的值必须采用日期格式,因此SimpleDateFormat对我来说不是一个好选择 所以从这篇文章中了解java.sql.date和java.util.date的区别,然后创建第一个对象

Date date = new java.sql.Date(1430454600000L); 

yyyy-mm-dd方法提供toString值。

答案 4 :(得分:0)

java.time

Answer by BalusC是正确的:您无法从定义为保存日期加上时间的类对象中消除时间。

此外,您正在使用现在已过时的麻烦的旧类(java.util.Datejava.sql.Date),取而代之的是 java.time 类。

而是使用仅限日期的类来表示仅限日期的值。 LocalDate类表示没有时间且没有时区的仅日期值。 java.sql.Date 假装执行相同的操作,但由于从java.util.Date继承的设计决策非常糟糕,实际上确实会占用一天的时间。避免java.sql.Date,而只使用java.time.LocalDate

您显然是从一个java.util.Date对象开始。这表示UTC时间轴上的一个点,分辨率以毫秒为单位。因此,使用它来确定日期需要一个时区。 LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  

如果要使用JVM的当前默认时区,请求它并作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好是明确的,因为默认情况下可以在运行时期间由JVM中任何应用程序的任何线程中的任何代码随时更改

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

要从java.util.Date获取仅限日期的值,请先转换为 java.time 替换Instant。要来回转换,请调用添加到旧类的新方法。

Instant instant = myJavaUtilDate.toInstant() ;

根据定义,该值以UTC为单位。应用所需的时区(ZoneId)以生成ZonedDateTime

ZonedDateTime zdt = instant.atZone( z ) ;

最后,从LocalDate中提取所需的ZonedDateTime对象。

LocalDate ld = zdt.toLocalDate() ;

从JDBC 4.2及更高版本开始,您可以直接与数据库交换 java.time 类。因此,无需使用java.sql类,例如java.sql.Datejava.sql.Timestamp

myPreparedStatement.setObject( … , ld ) ;

检索。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore