Java 如何在不设置区域设置的情况下设置NLS日期格式

Java 如何在不设置区域设置的情况下设置NLS日期格式,java,internationalization,plsql,jdbc,Java,Internationalization,Plsql,Jdbc,我们的java类调用PLSQL proc,它以NLS_date_格式定义的默认格式返回日期。我们的应用程序为国际化设置了自己的语言环境,但我希望日期格式保持为“DD-MON-RR”,即en_US Locale NLS_date_格式。由于区域设置的更改,oracle获取的日期字符串不同,后续的函数调用将失败。我试图通过将Locale更改为Locale.setDefault(新的Locale(“en”,“US”))来解决这个问题//java类中的“en_US”,它可以正常工作,但国际化部分不再工作

我们的java类调用PLSQL proc,它以NLS_date_格式定义的默认格式返回日期。我们的应用程序为国际化设置了自己的语言环境,但我希望日期格式保持为“DD-MON-RR”,即en_US Locale NLS_date_格式。由于区域设置的更改,oracle获取的日期字符串不同,后续的函数调用将失败。我试图通过将
Locale更改为Locale.setDefault(新的Locale(“en”,“US”))来解决这个问题//java类中的“en_US”
,它可以正常工作,但国际化部分不再工作。我在新加坡,所以我的地区是
“en_SG”
,oracle在设置
NLS_TERRITORY:Singapore
后采用的日期格式是
NLS_日期格式:'DD/MM/RR'
。我向服务器查询V$NLS_参数,默认的日期格式是“DD-MON-RR”。所以我的问题是,我可以在不影响应用程序的语言环境设置的情况下设置NLS_DATE_格式吗。或者我可以让jdbc驱动程序完全忽略客户端的NLS设置吗

Yo可以使用
to_char
函数来格式化日期,也可以在
to_char
函数中包含第三个参数来表示所使用的语言环境:

select to_char(sysdate, 'DY-MM-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN')  from dual;

有关日期格式的更多信息,请参见。

我正在完成我的应用程序的i18n内容,我的设计基于以下假设)

1) setDefault(新语言环境(“en”、“US”);这很糟糕,因为您正在更改JVM而不仅仅是应用程序的默认语言环境。因此,最好在每个请求的基础上传递应用程序的区域设置(可能是threadlocal)


2) 在应用程序级别处理所有i18n格式化/解析。DB应该只处理比较(可选)、排序(可选)和存储。所以只需设置NLS_字符集、NLS_COMP、NLS_排序和NLS_LENGTH_语义。顺便说一句,db级别的比较和排序意味着创建特定于语言环境的索引,从而降低插入/更新的速度

哦,是的,实际上,如果我的情况可能的话,我可以在PLSQL中使用
来表示字符(sysdate,'DD-MON-RR')
。但我的项目是将一部分旧的PRO C*代码重新设计成java。因此,每个人都希望保持PL/SQL部分不变,因为它目前运行良好。问题发生在PRO C*代码与数据库位于同一台计算机上,因此它们遵循相同的NLS设置。但是这个Java类可能是ApplicationServer的一部分,并且在将来很可能会转移到web服务中。因此,我希望保留现有的语言环境设置,因为应用程序目前也可以正常工作。是的,您的第一点是正确的。对于第二点,我们在前端使用了i18n格式,但该过程从oracle过程返回字符串格式的数据。一个更简单的字符串格式代码是
从TABLEXYZ中选择'MKDT'| | lpad(nvl(长度(por.maker_日期),0),3,'0')| | por.maker| u日期数据我猜这行会自动调用
到字符(,)
并转换日期。我知道他们应该用
来描述(,)
。我已经建议在DB进程中进行此更改,但它涉及到对稳定进程的大量更改。