[英]Parsing Date and time from "yyyy-MM-dd hh:mm:ss.SSS" -------> "hh:mm aa" in android
[英]XMLGregorianCalendar date format 'dd/MM/yyyy HH:mm:ss.SSS'
String formatA ="yyyy-MM-dd'T'HH:mm:ss'Z'";
String formatB = "dd/MM/yyyy HH:mm:ss.SSS";
try {
XMLGregorianCalendar gregFmt = DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat(formatB).format(new Date()));
System.out.println(gregFmt);
} catch (DatatypeConfigurationException e) {
};
我正在嘗試合並XMLGregorianCalendar date。 上面的代碼很好地格式化了格式"yyyy-MM-dd'T'HH:mm:ss'Z'"
但是對於formatB dd/MM/yyyy HH:mm:ss.SSS
它會引發錯誤
java.lang.IllegalArgumentException
對如何修復提出建議。 非常感謝!
日志
Exception in thread "main" java.lang.IllegalArgumentException: 23/08/2017 16:13:04.140
at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parseAndSetYear(XMLGregorianCalendarImpl.java:2887)
at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parse(XMLGregorianCalendarImpl.java:2773)
at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.<init>(XMLGregorianCalendarImpl.java:435)
at com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl.newXMLGregorianCalendar(DatatypeFactoryImpl.java:536)
at test.test.main(test.java:19)
第19行是第4行,在上面的代碼'XMLGregorianCalendar gregFmt ...'中
XML規范中描述了newXMLGregorianCalendar(string)
接受的格式,該格式不同於您嘗試使用的formatB
。
String
對象。 Date
和XMLGregorianCalendar
類。 例:
myXMLGregorianCalendar // If you must use this class… but try to avoid. Use *java.time* classes instead.
.toGregorianCalendar() // Converting from `javax.xml.datatype.XMLGregorianCalendar` to `java.util.GregorianCalendar`.
.toZonedDateTime() // Converting from `java.util.GregorianCalendar` to `java.time.ZonedDateTime`, from legacy class to modern class.
.format( // Generate a `String` representing the moment stored in our `ZonedDateTime` object.
DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss.SSS" ) // Define a formatting pattern as you desire. Or better, automatically localize by calling `DateTimeFormatter.ofLocalized…` methods.
) // Returns a `String` object, distinct from our `ZonedDateTime` object.
07/07/2018 15:20:14.372
不要將日期時間對象與它們生成的代表其值的字符串相混淆。 日期時間值(包括以下討論的類)不是String
,不將文本用作其內部值,並且沒有“格式”。 它們都可以生成並解析字符串以表示其日期時間值。
現代方法使用了java.time類, 該類取代了麻煩的舊舊日期時間類,例如XMLGregorianCalendar
。
應該將java.util.Date
的使用替換為java.time.Instant
。 兩者都代表UTC的時刻。 Instant
使用更好的分辨率,而不是毫秒。
您可以輕松地在現代類和傳統類之間進行轉換。 請注意,在舊類中添加了新的轉換方法,在本例java.util.GregorianCalendar::toZonedDateTime
。
首先將javax.xml.datatype.XMLGregorianCalendar
轉換為java.util.GregorianCalendar
。
GregorianCalendar gc = myXMLGregorianCalendar.toGregorianCalendar() ;
現在擺脫這些遺留類,進入java.time。
ZonedDateTime zdt = gc.toZonedDateTime() ;
到目前為止,所有這三種類型, XMLGregorianCalendar
, GregorianCalendar
和ZonedDateTime
都表示相同的時刻,帶有日期的日期和指定的時區。
有了ZonedDateTime
,您可以生成標准ISO 8601格式的字符串,該字符串已擴展為將時區的名稱附加在方括號中。
String output = zdt.toString() ; // Generate string in standard ISO 8601 format extended by appending the name of time zone in square brackets.
2018-07-07T15:20:14.372-07:00 [美國/洛杉磯]
您可以使用DateTimeFormatter
類生成其他格式的字符串。 對於問題中第二個列出的格式設置模式,請定義一個匹配的DateTimeFormatter
對象。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss.SSS" ) ;
String output = zdt.format( f ) ;
07/07/2018 15:20:14.372
您的問題中列出的第一種格式模式的末尾有一個Z
,表示UTC,發音為“ Zulu”。 要將我們的ZonedDateTime
調整為UTC,只需提取一個Instant
對象。 根據定義, Instant
始終使用UTC。
Instant instant = zdt.toInstant() ; // Extract an `Instant` object, always in UTC.
按照問題中首先顯示的模式生成字符串。
String output = instant.toString() ; // Generate string in standard ISO 8601 format.
2018-07-07T22:20:14.372Z
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310 。
您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 。 不需要字符串,不需要java.sql.*
類。
在哪里獲取java.time類?
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.