我尝试在jdbc中设置NLS_DATE_FORMAT,它似乎没有任何作用.
我的代码:
//...
Connection conn = ods.getConnection();
Statement stat = conn.createStatement();
stat.execute("alter session set NLS_DATE_FORMAT='YYYY-DD-MM'");
ResultSet rs = stat.executeQuery("select date_column from test_table");
System.out.println(rs.getString(1)); // *** new format not effective here ***
//...
经过一番阅读.我知道NLS_DATE_FORMAT在JDBC驱动程序中进行了硬编码.这个对吗 ?由此得出的结论:
Language and Territory
The Thin driver obtains language and territory settings (NLS_LANGUAGE and NLS_TERRITORY) from the Java locale in the JVM user.language property. The date format (NLS_DATE_FORMAT) is set according to the territory setting.
所以我尝试了这个:
Locale.setDefault(new Locale("en", "US"));
Connection conn = ods.getConnection();
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select date_column from test_table");
System.out.println(rs.getString(1)); // *** JVM format not effective here
但这不起作用.而不是得到像
10-OCT-15 (NLS_DATE_FORMAT for US = 'DD-MON-RR')
我懂了
2015-10-10 00:00:00.0
使用ORACLE 11g,Oracle jdbc驱动器12.1,java 8
解决方法:
JDBC驱动程序对NLS的支持为dropped in Oracle 10g.无论如何,我建议您不要依赖于Oracle的NLS功能来格式化日期.
要格式化从Java中任何数据库中检索到的日期,请执行以下操作:
Connection conn = ods.getConnection();
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select date_column from test_table");
DateFormat format = new SimpleDateFormat('yyyy-dd-MM');
System.out.println(format.format(rs.getDate(1));
请注意,SimpleDateFormat的实例是可重用的,但不是线程安全的.
如果您使用的是Java 8,则可能要使用新的和改进的Java Time API.不幸的是,尚未更新ResultSet以返回DateTime的实例,因此您必须进行转换.查看有关如何从旧版本转换为新版本的DateTimeFormatter和this question.除其他优点外,DateTimeFormatter是完全线程安全的.
标签:oracle,jdbc,java,date
来源: https://codeday.me/bug/20191118/2030862.html