1

是否有任何实用程序可以java.text.SimpleDateFormat从 Oracleto_char格式模式返回模式?

create or replace type type_sample as object (
  f_id number,
  f_name varchar2(100),
  f_start_date date,
  f_end_date date
)
/

SET SERVEROUTPUT ON
DECLARE
  xmltype1            SYS.XMLType;
  message             type_sample;
BEGIN
  message := new type_sample(1, 'Manohar', current_date, sysdate);
  xmltype1 := XMLtype.createXML(message);
  DBMS_OUTPUT.PUT_LINE('out_errm : '|| xmltype1.getStringVal());
END;
/

<TYPE_SAMPLE><F_ID>1</F_ID><F_NAME>Manohar</F_NAME><F_START_DATE>26-JAN-13</F_START_DATE>**<F_END_DATE>26-JAN-13</F_END_DATE>**</TYPE_SAMPLE>

我有上面的 XML 来自数据库。根据运行上述代码的会话,日期格式以不同的格式出现。

我可以在这里做的是,可以从 Java 端获取该会话的日期格式模式。如果我可以将该日期格式模式(oracle db)转换为java.text.SimpleDateFormat模式,我的问题就解决了。你能帮帮我吗?


我在这里没有得到预期的答案。可能是我的演示文稿没有清楚地解释问题。

我现在要问一个直截了当的问题。据我所知,java.text.SimpleDateFormat 毕竟是 java.text.DateFormat 的实现。DateFormat 的这个实现可以理解以下模式字母

G   Era designator
y   Year
M   Month in year
w   Week in year
W   Week in month
D   Day in year
d   Day in month
F   Day of week in month
E   Day in week
a   Am/pm marker
H   Hour in day (0-23)
k   Hour in day (1-24)
K   Hour in am/pm (0-11)
h   Hour in am/pm (1-12)
m   Minute in hour
s   Second in minute
S   Millisecond
z   Time zone
Z   Time zone 

java.text.DateFormat还有其他的实现,可以理解一些其他的模式字母组吗?如果有,请告诉我。

4

2 回答 2

0

XML 中的日期之一是 26-JAN-13。那将是SimpleDateFormat“dd-MMM-yy”

SimpleDateFormat oracleFormat = new SimpleDateFormat("dd-MMM-yy");
Date date = oracleFormat.parse(dateString);
于 2013-02-04T15:06:39.203 回答
0

不完全是您所要求的,但这里有一种不同的方法来避免会话 NLS 参数的不确定性。您可以在对象中进行转换,因此您可以使用显式日期格式掩码,并且在将其转换为 XML 时它已经是一个字符串:

create or replace type type_sample as object (
    f_id number,
    f_name varchar2(100),
    f_start_date varchar2(10),
    f_end_date varchar2(10),
    constructor function type_sample(self in out nocopy type_sample,
        f_id number, f_name varchar2, f_start_date date, f_end_date date)
        return self as result
)
/

create or replace type body type_sample as
    constructor function type_sample(self in out nocopy type_sample,
        f_id number, f_name varchar2, f_start_date date, f_end_date date)
        return self as result is
    begin
        self.f_id := f_id;
        self.f_name := f_name;
        self.f_start_date := to_char(f_start_date, 'YYYY-MM-DD');
        self.f_end_date := to_char(f_end_date, 'YYYY-MM-DD');
        return;
    end;
end;
/

创建对象的方式没有变化:

set serveroutput on
declare
    xmltype1 sys.xmltype;
    message type_sample;
begin
    message := new type_sample(1, 'Manohar', current_date, sysdate);
    xmltype1 := xmltype.createxml(message);
    dbms_output.put_line('out_errm : '|| xmltype1.getStringVal());
end;
/

out_errm : <TYPE_SAMPLE><F_ID>1</F_ID><F_NAME>Manohar</F_NAME><F_START_DATE>2013-02-04</F_START_DATE><F_END_DATE>2013-02-04</F_END_DATE></TYPE_SAMPLE>

日期始终YYYY-MM-DD采用 XML 格式,与会话无关NLS_DATE_FORMAT(恰好DD-MON-RR在此会话中)。当然,您可以使用任何您想要的固定格式,您只需要在对象和 Java 之间同意该格式。

(我想我假设这是该对象的唯一用途;否则将日期放入字符串不是一个好主意......)。

于 2013-02-04T18:44:32.573 回答