W3C XML 模式時間數據格式:
"2014-11-17T 09:40:25" 或者 “2014-11-17T 09:40:25+08:00”
要想把以上格式的時間轉換為能被java所使用個格式有以下3種辦法:
(1)、jdk中有這么一個類XMLGregorianCalendar,使用XMLGregorianCalendar類中的toGreGregorianCalendar().getTimeInMillis()方法,返回TimesTamp對象。
用法:
Timestamp timestamp = new Timestamp(xmlDate.toGregorianCalendar().getTimeInMillis());
拿到了Timestamp 對象,大家應該都知道怎么做了吧!可以用SimpleDateFormat()?想要轉成啥樣都行。不
過,SimpleDateFormat() 也正是我要說的第二種方法。
注釋:XMLGregorianCalendar類是jdk1.5之后才有的類,但在jdk api的官方文檔中未提及此類,可以在其他官方文檔中看到粗略的說明,不保證在下一版本的jdk中會保留此類。
(2)、SimpleDateFormat()
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.CHINESE);
format.setTimeZone(TimeZone.getTimeZone("GMT"));//"GMT":格林尼治時間, "UTC":世界統一時間
Date parse = format.parse("2014-11-12T22:00:44.0000000Z");
//.0000000Z未標明時區,即默認是GMT的時間,在打印的時候按照咱們東八區,則是第二天的6點.
System.out.println("parse: " + parse);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Date d2 = sdf.parse("2014-11-05T22:30:56.183+0800");
System.out.println("d2: "+d2); // output Wed Sep 17 12:00:44 IST 2014
System.out.println(sdf.format(d2));
sdf.setTimeZone(TimeZone.getDefault());
System.out.println(sdf.format(d2));
注意:用System,out.prientln()打印Date的時候是按你本地時區時間來顯示
有人就會說了,既然可以直接用SimpleDateFormat()來轉,為嘛要采用第一種呢,問題就在這兒,因為schame中的時間可能帶時區,也可能不帶時區,可是你要知道在你使用new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 的時候,你的模板格式是固定的。你如何知道對方傳來的是帶時區的還是不帶時區的呢?所以這種方式是存在很大的風險的,但只要時間模式能固定,該方法還是可行的。不然,你要是不嫌麻煩,可以一個字符一個字符的去判斷和解析,主要判斷ss后面有沒有跟毫秒,毫秒后面有沒有跟時區。
(3)、使用JAXB,jaxb可以將xml轉換為java對象,其內部機制能直接轉為你要的Date,只要你的對象中定義的時間屬性是DateTime類型即可。
希望我做的這些筆記能幫助大家盡快解決問題少走一些彎路!
xml中的時間轉換為Date類型:
javax.xml.bind.DatatypeConverter.parseDateTime(reqTime).getTime() ?//?reqTime是從Node中獲得的String類型時間