如何将字符串类型日期转换为日期以进入 oracle DB - Java
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。
最好和最小的代码是什么?
试试这个代码:
Date d = new SimpleDateFormat("dd/MM/yyyy").parse(date);
如果您使用的是 java 8,那么有一个非常有用的日期格式 class java.time.format.DateTimeFormatter
有了那个 class 你可以做这样的事情:
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);
In java 8 从该字符串中获取 java.sql.Date
(= java.util.Date
,时间为零)可能会使用格式化程序,但由于该字符串几乎是 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);
好的,所以您有一个 String
,其值为 2014-11-03 00.00.00.0
,您希望将该值插入到 Oracle 数据库 Table 内的 DATE
字段中,使用Java 的 JDBC?
嗯,首先,使用 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);
tl;博士
myPreparedStatement.setObject(
… ,
LocalDate.parse( "2014-11-03 00.00.00.0".substring( 0 , 10 ) )
);
What could be the best possible and smallest code?
给你。但我 不 建议实际上将这么多内容压缩到一行中。 “最好”的代码很少是“最小”的代码。
详情
其他答案正确。但这里有更短的内容。
首先,您不应该将仅限日期的值作为字符串提交给数据库。作为仅限日期的对象提交。您的 JDBC driver 将处理与数据库通信的细节。
首先通过调用 String::substring
提取您的日期值。在月份和日期上填充零,我们知道前 10 位数字是日期。
LocalDate ld = LocalDate.parse( "2014-11-03 00.00.00.0".substring( 0 , 10 ) );
如果您的 JDBC 驱动程序符合 JDBC 4.2 or later, you can pass the LocalDate
directly via PreparedStatement::setObject
.
myPreparedStatement.setObject( … , ld );
……或者:
myPreparedStatement.setObject( … , ld , JDBCType.DATE );
如果您的驱动程序不兼容,请转换为旧版 class java.sql.Date
。查看添加到旧 classes 的新方法。
java.sql.Date sqlDate = java.sql.Date.valueOf( ld );
此处描述的方法假定输入字符串用于 UTC. If not, you need to adjust into UTC. Search Stack Overflow for posts on parsing a string as a ZonedDateTime
。
这也适用于我。一个小的实用程序方法,用于生成可以插入到 Oracle 数据库日期字段中的日期的字符串值,有点脏但可以工作。
第一个函数使用 Calender class,第二个函数使用 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;
}
传入日期格式 ID 2014-11-03 00.00.00.0,需要转换为 03/11/2014 或 03-Nov-2014。
最好和最小的代码是什么?
试试这个代码:
Date d = new SimpleDateFormat("dd/MM/yyyy").parse(date);
如果您使用的是 java 8,那么有一个非常有用的日期格式 class java.time.format.DateTimeFormatter
有了那个 class 你可以做这样的事情:
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);
In java 8 从该字符串中获取 java.sql.Date
(= java.util.Date
,时间为零)可能会使用格式化程序,但由于该字符串几乎是 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);
好的,所以您有一个 String
,其值为 2014-11-03 00.00.00.0
,您希望将该值插入到 Oracle 数据库 Table 内的 DATE
字段中,使用Java 的 JDBC?
嗯,首先,使用 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);
tl;博士
myPreparedStatement.setObject(
… ,
LocalDate.parse( "2014-11-03 00.00.00.0".substring( 0 , 10 ) )
);
What could be the best possible and smallest code?
给你。但我 不 建议实际上将这么多内容压缩到一行中。 “最好”的代码很少是“最小”的代码。
详情
其他答案正确。但这里有更短的内容。
首先,您不应该将仅限日期的值作为字符串提交给数据库。作为仅限日期的对象提交。您的 JDBC driver 将处理与数据库通信的细节。
首先通过调用 String::substring
提取您的日期值。在月份和日期上填充零,我们知道前 10 位数字是日期。
LocalDate ld = LocalDate.parse( "2014-11-03 00.00.00.0".substring( 0 , 10 ) );
如果您的 JDBC 驱动程序符合 JDBC 4.2 or later, you can pass the LocalDate
directly via PreparedStatement::setObject
.
myPreparedStatement.setObject( … , ld );
……或者:
myPreparedStatement.setObject( … , ld , JDBCType.DATE );
如果您的驱动程序不兼容,请转换为旧版 class java.sql.Date
。查看添加到旧 classes 的新方法。
java.sql.Date sqlDate = java.sql.Date.valueOf( ld );
此处描述的方法假定输入字符串用于 UTC. If not, you need to adjust into UTC. Search Stack Overflow for posts on parsing a string as a ZonedDateTime
。
这也适用于我。一个小的实用程序方法,用于生成可以插入到 Oracle 数据库日期字段中的日期的字符串值,有点脏但可以工作。 第一个函数使用 Calender class,第二个函数使用 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;
}