我具有以下格式的日期:
(java.util.Date)IST 2018年9月5日12:30:00
我需要将此日期转换为dd-MMM-yy。
我使用了以下代码:
public static String converToSqlDate(Date date) {
String strDate = null;
java.text.SimpleDateFormat sdf = new SimpleDateFormat(WSRDConstants.SQL_FORMAT); //dd-MMM-yy
if (date != null) {
strDate = sdf.format(date);
} else {
return null;
}
return strDate;
}
但是,当我尝试将日期保留在DB中时,它没有这样做并将其保存为null参数。 我正在使用JDBC将数据持久存储到数据库中。
答案 0 :(得分:1)
使用对象而不是文本将日期值保留到数据库中。
将过时的Date
转换为现代的Instant
。使用JDBC 4.2发送到数据库。
myPreparedStmt.setObject(
… ,
myJavaUtilDate // Avoid the terrible legacy date-time classes. Use only java.time classes.
.toInstant() // Convert from legacy class to modern. Both represent a moment in UTC.
.atZone( // Adjust from UTC to the wall-clock time used by the people of a particular region, a time zone.
ZoneId.of( "Africa/Tunis" )
) // Returns a `ZonedDateTime` object.
.toLocalDate() // Extract only the date, without time-of-day and without time zone. Returns a `LocalDate` object.
) ;
使用日期时间值时,请使用日期时间类型,而不要使用String
。
从JDBC 4.2开始,我们可以与数据库交换 java.time 对象。无需使用可怕的旧式旧类,例如java.sql.Date
和java.sql.Timestamp
以及java.util.Date
如果您有java.util.Date
对象,请立即转换为现代替换对象java.time.Instant
。要进行转换,请在旧类上调用新方法。
Instant instant = myJavaUtilDate.toInstant() ;
旧类和Instant
都代表UTC的时刻。要确定该日期的日期或一天中的某个时间,我们必须调整到所需的/预期的时区。在任何给定的时刻,日期和时间在全球范围内都会有所不同。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
仅提取日期。
LocalDate ld = zdt.toLocalDate() ;
发送到数据库。
myPreparedStmt.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。