[英]How to Convert String type date to date for entry into oracle DB - Java
傳入日期格式 id 2014-11-03 00.00.00.0,需要轉換為 03/11/2014 或 03-Nov-2014。
什么可能是最好的和最小的代碼?
好的,所以您有一個值為2014-11-03 00.00.00.0
的String
,並且您想使用 Java 的 JDBC 將該值插入到 Oracle 數據庫表內的DATE
字段中?
好吧,首先,使用SimpleDateFormat對象將該String
轉換為Date
對象:
String s = "2014-11-03 00.00.00.0";
Date d = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss.S").parse(s);
然后,如果您使用的是普通語句,請按照 Oracle 在SQL INSERT
命令中接受它的方式重新格式化它,再次使用SimpleDateFormat
對象:
String sd = new SimpleDateFormat("dd/MM/yyyy").format(d);
並將其插入您的聲明中:
cn.createStatement().executeUpdate("INSERT INTO TABLE(...) VALUES(" + sd + ");
我建議您更好地使用PreparedStatement而不是普通的SQL INSERT
語句,以便對您的語句進行清理:
PreparedStatement ps = cn.prepareStatement("INSERT INTO table VALUES(?, ?, ?)");
然后,將您的日期作為 Date 對象插入,無需格式化為字符串:
ps.setDate([index of the field to insert], d);
如果您使用的是 java 8,則有一個非常有用的日期格式類java.time.format.DateTimeFormatter
使用該類,您可以執行以下操作:
LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH.mm.ss");
String text = date.format(formatter);
LocalDate parsedDate = LocalDate.parse(text, formatter);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/DD/YYYY");
String newText = parsedDate.format(formatter2);
試試這個代碼:
Date d = new SimpleDateFormat("dd/MM/yyyy").parse(date);
在 java 8 java.util.Date
,從該字符串java.util.Date
java.sql.Date
(= java.util.Date
with zero time) 可能會使用格式化程序,但由於該字符串幾乎是 ISO 標准:
LocalDateTime x = LocalDateTime.parse("2014-11-03T00:00:00.0");
可以將字符串修補為:
LocalDateTime t = LocalDateTime.parse("2014-11-03 00.00.00.0"
.replaceFirst(" ", "T") // Make ISO
.replaceFirst("\\.", ":")
.replaceFirst("\\.", ":"));
java.sql.Date time = java.sql.Date.valueOf(t.toLocalDate());
或者
LocalDate t = LocalDate.parse("2014-11-03 00.00.00.0"
.replaceFirst(" .*$", "")); // Remove time part
java.sql.Date time = java.sql.Date.valueOf(t);
myPreparedStatement.setObject(
… ,
LocalDate.parse( "2014-11-03 00.00.00.0".substring( 0 , 10 ) )
);
什么可能是最好的和最小的代碼?
你去吧。 但我不建議實際上將這么多內容壓縮成一行。 “最好”的代碼很少是“最小的”代碼。
其他答案都是正確的。 但這里有一些更短的東西。
首先,您不應該將僅日期值作為字符串提交給數據庫。 作為僅限日期的對象提交。 您的JDBC 驅動程序將處理與數據庫通信的細節。
首先通過調用String::substring
提取您的日期值。 通過在月和月日填充零,我們知道前 10 位數字是日期。
LocalDate ld = LocalDate.parse( "2014-11-03 00.00.00.0".substring( 0 , 10 ) );
如果您的 JDBC 驅動程序符合JDBC 4.2或更高版本,您可以直接通過PreparedStatement::setObject
傳遞LocalDate
。
myPreparedStatement.setObject( … , ld );
……或者也許:
myPreparedStatement.setObject( … , ld , JDBCType.DATE );
如果您的驅動程序不符合要求,請轉換為遺留類java.sql.Date
。 尋找添加到舊類中的新方法。
java.sql.Date sqlDate = java.sql.Date.valueOf( ld );
此處描述的方法假定輸入字符串用於UTC 。 如果不是,則需要調整為 UTC。 在 Stack Overflow 上搜索有關將字符串解析為ZonedDateTime
。
這也適用於我。 一個生成日期字符串值的小實用方法,可以插入到 Oracle 數據庫日期字段中,有點臟但有效。 第一個函數使用 Calender 類,第二個使用 LocalDate(Java8 或更高版本)
1.
/*
* Format Date for Presentation in format
* 19-DEC-2019 i.e. Oracle DB DD-MMM-YYYYY
*/
private String stringToDate(String inputDate) {
String finalDate = null;
if (inputDate == null)
return null;
try {
Date parseDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(inputDate);
// set your local time zone
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Africa/Lusaka"));
cal.setTime(parseDate);
String finalMonth = "";
int yearVal = cal.get(Calendar.YEAR);
int monthVal = cal.get(Calendar.MONTH); //returns value 0 to 11
int dayVal = cal.get(Calendar.DAY_OF_MONTH);
switch(monthVal) {
case 0:
finalMonth = "JAN";
break;
case 1:
finalMonth = "FEB";
break;
case 2:
finalMonth = "MAR";
break;
case 3:
finalMonth = "APR";
break;
case 4:
finalMonth = "MAY";
break;
case 5:
finalMonth = "JUN";
break;
case 6:
finalMonth = "JUL";
break;
case 7:
finalMonth = "AUG";
break;
case 8:
finalMonth = "SEP";
break;
case 9:
finalMonth = "OCT";
break;
case 10:
finalMonth = "NOV";
break;
case 11:
finalMonth = "DEC";
break;
}
finalDate = dayVal+"-"+finalMonth+"-"+yearVal;
} catch (ParseException e) {
e.printStackTrace();
}
return finalDate;
}
2.
/*
* Format Date for Presentation in format
* 19-DEC-2019 i.e. Oracle DB DD-MMM-YYYYY
*/
private String stringToDateJava8(String inputDate) {
String finalDate = null;
if (inputDate == null)
return null;
try {
Date parseDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(inputDate);
String finalMonth = "";
LocalDate localDate = parseDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int yearVal = localDate.getYear();
int monthVal = localDate.getMonthValue(); //returns value 1 to 12
int dayVal = localDate.getDayOfMonth();
switch(monthVal) {
case 1:
finalMonth = "JAN";
break;
case 2:
finalMonth = "FEB";
break;
case 3:
finalMonth = "MAR";
break;
case 4:
finalMonth = "APR";
break;
case 5:
finalMonth = "MAY";
break;
case 6:
finalMonth = "JUN";
break;
case 7:
finalMonth = "JUL";
break;
case 8:
finalMonth = "AUG";
break;
case 9:
finalMonth = "SEP";
break;
case 10:
finalMonth = "OCT";
break;
case 11:
finalMonth = "NOV";
break;
case 12:
finalMonth = "DEC";
break;
}
finalDate = dayVal+"-"+finalMonth+"-"+yearVal;
} catch (ParseException e) {
e.printStackTrace();
}
return finalDate;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.