我想实现以下目标:
我有字符串格式的日期,例如“ 2015-05-12 15:15:24”, 我想将其转换为“ dd-MMM-yy”格式的sql date。 但是,这不起作用。下面是代码段:
String rawDate="2015-05-12 15:15:24";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date =format.parse(rawDate);
Date sqlDate = new java.sql.Date(date.getTime());
SimpleDateFormat changedFormat = new SimpleDateFormat("dd-MMM-yy");
Date date2=changedFormat.parse(changedFormat.format(sqlDate));
Date sqlDate2 = new java.sql.Date(date2.getTime());
System.out.println("sqlDate : "+sqlDate +" :::::: Date2 : "+date2+" :::: sqlDate2 "+sqlDate2);ow here is the Test : "+sqlDate2);
程序的输出为:
sqlDate:2015-05-12 :::::: Date2:Tue May 12 00:00:00 BST 2015 :::: sqlDate2 2015-05-12
目标是以15年5月12日java.sql格式获取日期,但是May并没有被翻译成字母月份,而是打印为数字。
我错过了任何东西。任何帮助将不胜感激。答案 0 :(得分:2)
使用对象而非字符串与数据库进行通信。
仅使用 java.time 类,从不使用java.util.Date
,Calendar
或java.sql.Date
类。
myPreparedStatement.setObject( // Use smart objects, not dumb strings.
… , // Specify which placeholder `?` in you SQL.
LocalDateTime.parse( // Parse input string lacking any zone or offset as a `LocalDateTime` object. *NOT* a moment, just a vague idea about *potential* moments.
"2015-05-12 15:15:24".replace( " " , "T" ) // Alter your input string to comply with ISO 8601 standard format, with `T` in the middle.
) // Returns a `LocalDateTime` object.
.atOffset( // Apply an offset-from-UTC to determine a moment, a specific point on the timeline.
ZoneOffset.UTC // Apply UTC if the input string was intended to be a moment in UTC.
) // Returns a `OffsetDateTime` object.
.toLocalDate() // Extract a date-only value, a `LocalDate` object from the date-with-time `OffsetDateTime` object.
)
将其转换为sql日期,格式为“ dd-MMM-yy”
没有这种SQL标准格式。日期的SQL标准格式与ISO 8601标准格式相同:YYYY-MM-DD。
您使用的是可怕的旧类,而这些旧类在多年前被现代的 java.time 类所取代。
LocalDateTime
您的输入字符串缺少时区或UTC偏移量的任何指示。因此解析为LocalDateTime
。
java.time 类在解析和生成字符串时默认使用标准ISO 8601格式。您的输入字符串几乎符合标准。只需将中间的SPACE替换为T
。
String input = "2015-05-12 15:15:24".replace( " " , "T" ) ;
解析。
LocalDateTime ldt = LocalDateTime.parse( input ) ;
OffsetDateTime
LocalDateTime
代表不是。它代表了大约26-27小时(全球时区范围)内的潜在时刻。如果您知道预期的时区,请应用ZoneId
以获取ZonedDateTime
对象。如果您仅知道偏移而不是区域,请应用ZoneOffset
以获取OffsetDateTime
对象。我将假设您的值旨在表示UTC时刻,换句话说,与UTC的偏移量为零。
OffsetDateTime odt = ldt.atOffset( Offset.UTC ) ;
您应该使用适合您的SQL数据类型的类类型来与数据库交换数据。使用智能对象,而不是哑字符串。
从JDBC 4.2开始,我们可以直接交换 java.time 对象。
myPreparedStatement.setObject( … , odt ) ;
检索。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
LocalDate
您只关心日期,而不关心时间。因此,提取一个LocalDate
对象。
LocalDate ld = odt.toLocalDate() ;
提交到数据库。
myPreparedStatement.setObject( … , ld ) ;
检索。
LocalDate ld = myPreparedStatement.getObject( … , LocalDate.class ) ;
这是一个完整的示例应用程序,位于一个.java
中。
使用H2 Database Engine。我们指定一个内存数据库,该数据库永远不会持久存储,因为这只是一个演示。
package com.basilbourque.example;
import java.sql.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.UUID;
public class DateIntoDatabase {
public static void main ( String[] args ) {
DateIntoDatabase app = new DateIntoDatabase();
app.doIt();
}
private void doIt () {
try {
Class.forName( "org.h2.Driver" );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
try (
Connection conn = DriverManager.getConnection( "jdbc:h2:mem:date_into_db_example_" ) ;
Statement stmt = conn.createStatement() ;
) {
String sql = "CREATE TABLE event_ (\n" +
" id_ UUID DEFAULT random_uuid() PRIMARY KEY ,\n" +
" name_ VARCHAR NOT NULL ,\n" +
" when_ DATE NOT NULL\n" +
") ; ";
System.out.println( sql );
stmt.execute( sql );
// Insert row.
sql = "INSERT INTO event_ ( name_ , when_ ) " + "VALUES ( ? , ? ) ;";
try ( PreparedStatement preparedStatement = conn.prepareStatement( sql ) ; ) {
String name = "whatever";
LocalDate ld = LocalDateTime.parse( "2015-05-12 15:15:24".replace( " " , "T" ) ).atOffset( ZoneOffset.UTC ).toLocalDate();
preparedStatement.setString( 1 , name );
preparedStatement.setObject( 2 , ld );
preparedStatement.executeUpdate();
}
// Query all.
sql = "SELECT * FROM event_ ;";
try ( ResultSet rs = stmt.executeQuery( sql ) ; ) {
while ( rs.next() ) {
//Retrieve by column name
UUID id = ( UUID ) rs.getObject( "id_" ); // Cast the `Object` object to UUID if your driver does not support JDBC 4.2 and its ability to pass the expected return type for type-safety.
String name = rs.getString( "name_" );
LocalDate ld = rs.getObject( "when_" , LocalDate.class );
//Display values
System.out.println( "id: " + id + " | name: " + name + " | when: " + ld );
}
}
} catch ( SQLException e ) {
e.printStackTrace();
}
}
}
运行时:
id:0a4fd38c-7d4e-4049-bc21-e349582c8bc5 |名称:随便|时间:2015-05-12
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。
答案 1 :(得分:1)
您已经计算过,但从未打印过:
String rawDate = "2015-05-12 15:15:24";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(rawDate);
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
SimpleDateFormat changedFormat = new SimpleDateFormat("dd-MMM-yy");
System.out.println("Formatted Date: " + changedFormat.format(sqlDate));
答案 2 :(得分:1)
您的代码中具有所需格式的日期,但是您正在使用其他对象类型date。
更改此内容:
Date date2=changedFormat.parse(changedFormat.format(sqlDate));
Date sqlDate2 = new java.sql.Date(date2.getTime());
对此:String dateformat =(changedFormat.format(sqlDate));
您可以从对象日期的字符串中传递值。但是,如果您打印var日期,则不会以所需的格式打印,这是因为:
日期本身不会存储任何格式。