java nls_Java-使用JDBC的NLS_DATE_FORMAT

本文讨论了在Java JDBC中尝试设置NLS_DATE_FORMAT未生效的问题,指出从Oracle 10g开始JDBC驱动不再支持NLS设置。建议不要依赖Oracle的NLS功能来格式化日期,而是推荐使用`SimpleDateFormat`或Java 8的`DateTimeFormatter`来格式化从数据库检索到的日期。文章提供了相关代码示例并强调了这些格式化类的使用注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我尝试在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值