我需要从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
的格式不同。我错过了什么。请帮忙。
更新
在我的应用程序中,我有两种不同的方法来获取dbDate
。 EXPIRY_DATE
列的类型为DATE
。
首次查询使用dbDate = (java.util.Date) rs.getDate("EXPIRY_DATE");
。
对于此dbDate
,System.out.println("date " + dbDate);
提供了date 2011-12-03
第二个查询使用dbDate = rs.getTimestamp("EXPIRY_DATE");
对于此dbDate
,System.out.println("date " + dbDate);
提供了date 2011-12-03 23:59:59.0
。
这是我的问题。正如我认为toString()
提出了问题,我没有提到完整的问题。
解决方案:
由于我的应用方法有多种用法,我无法避免java.sql.Date
。
我尝试了下面的工作,
dbDate = new java.sql.Date(dbDate.getTime());
答案 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.Date
与java.util.Date
混淆,并且您错误地理解toString()
的内部运作并被{{1}}误导方法。一切都是有意为之。
答案 1 :(得分:1)
如果您要执行的操作是删除Date
对象的时间部分:
Calendar
删除Date
对象的时间部分。正如这个问题所指出的那样:Java Date cut off time information。如果您只想获得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)
Answer by BalusC是正确的:您无法从定义为保存日期加上时间的类对象中消除时间。
此外,您正在使用现在已过时的麻烦的旧类(java.util.Date
和java.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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的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.Date
和java.sql.Timestamp
。
myPreparedStatement.setObject( … , ld ) ;
检索。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& 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。