NLS_DATE_FORMAT with JDBC



我试图在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驱动程序中硬编码的。这是正确的吗?由此得出的结论:

语言和地区

瘦驱动程序从JVM user.language属性中的Java区域设置获取语言和区域设置(NLS_language和NLS_territory)。日期格式(NLS_date_format)根据区域设置进行设置。

所以我尝试了这个:

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

Oracle 10g中删除了JDBC驱动程序对NLS的支持。无论如何,我建议您不要依赖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的实例是可重用的,但不是线程安全的。

如果您使用的是Java8,那么您可能需要使用新的改进的JavaTimeneneneba API。不幸的是,ResultSet还没有更新为返回DateTime的实例,所以您必须进行转换。看看DateTimeFormatter和这个关于如何从旧转换为新的问题。除其他优点外,DateTimeFormatter是完全线程安全的。

新旧样式的格式模式是相同的;这是新的文档。

最新更新