Java XMLGregoriaCalendar日期格式';年月日HH:MM:ss.SSS';
我正在尝试格式化XMLGregorianCalendar日期。 上述代码格式适用于格式Java XMLGregoriaCalendar日期格式';年月日HH:MM:ss.SSS';,java,xml,date,Java,Xml,Date,我正在尝试格式化XMLGregorianCalendar日期。 上述代码格式适用于格式“yyyy-MM-dd'T'HH:MM:ss'Z'” 但是对于formatBdd/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 = DatatypeFa
“yyyy-MM-dd'T'HH:MM:ss'Z'”
但是对于formatBdd/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) {
};
建议如何修复它。非常感谢你
日志
线程“main”java.lang.IllegalArgumentException中的异常:23/08/2017 16:13:04.140
位于com.sun.org.apache.xerces.internal.jaxp.datatype.xmlgoriancalendarimpl$Parser.parseAndSetYear(xmlgoriancalendarimpl.java:2887)
在com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parse(XMLGregorianCalendarImpl.java:2773)
在com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.(XMLGregorianCalendarImpl.java:435)
在com.sun.org.apache.xerces.internal.jaxp.datatype.datatypefactorympl.newxmlgoriancalendar(datatypefactorympl.java:536)上
位于test.test.main(test.java:19)
第19行是第4行,在上面的代码“XMLGregorianCalendar gregFmt…”中描述了
newXMLGregorianCalendar(字符串)
接受的格式,它与您尝试使用的formatB
不同。使用newXMLGregorianCalendar(字符串)的格式
accept在中有描述,它与您尝试使用的formatB
不同。tl;博士
- 日期时间对象没有“格式”。它们解析并生成
对象,这些对象以文本形式表示它们的值String
- 使用现代java.time,它取代了可怕的旧类
&Date
类xmlgoriiancalendar
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)
2018年7月7日15:20:14.372
日期时间对象没有格式
不要将日期时间对象与它们生成的字符串合并以表示其值。日期时间值,包括下面讨论的类,不是字符串
,不使用文本作为其内部值,也没有“格式”。它们都可以生成和解析字符串来表示它们的日期时间值
java.time
现代方法使用java.time类取代了旧的遗留日期时间类,如
java.util.Date
的使用应替换为java.time.Instant
。两者都代表UTC中的一个时刻<代码>即时使用纳秒而非毫秒的更精细分辨率
您可以轻松地在现代类和传统类之间进行转换。在本例中,请注意添加到旧类中的新转换方法
首先从转换为
现在离开这些遗留类,进入java.time
GregorianCalendar gc = myXMLGregorianCalendar.toGregorianCalendar() ;
到目前为止,所有三种类型,即XMLGregorianCalendar
,GregorianCalendar
,以及ZoneDateTime
都表示相同的时刻,一个日期,一天中的某个时间和一个指定的时区
有了ZonedDateTime
,您可以生成标准ISO 8601格式的字符串,扩展后将时区名称附加到方括号中
ZonedDateTime zdt = gc.toZonedDateTime() ;
2018-07-07T15:20:14.372-07:00[美国/洛杉矶]
您可以使用DateTimeFormatter
class以其他格式生成字符串。对于问题中第二个列出的格式模式,请定义一个匹配的DateTimeFormatter
对象
String output = zdt.toString() ; // Generate string in standard ISO 8601 format extended by appending the name of time zone in square brackets.
2018年7月7日15:20:14.372
问题中列出的第一个格式模式末尾有一个Z
,表示UTC,发音为“Zulu”。要将我们的ZonedDateTime
调整为UTC,只需提取一个Instant
对象。根据定义,即时
始终为UTC
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss.SSS" ) ;
String output = zdt.format( f ) ;
按照问题中首先显示的模式生成字符串
Instant instant = zdt.toInstant() ; // Extract an `Instant` object, always in UTC.
2018-07-07T22:20:14.372Z
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- 然后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(tl;dr
- 日期时间对象没有“格式”。它们解析并生成以文本形式表示其值的
对象String
- 使用现代java.time,它取代了可怕的旧类
&Date
类xmlgoriiancalendar
2018年7月7日15:20:14.372 日期时间对象没有格式 不要将日期时间对象与其生成的字符串合并以表示其值。日期时间值(包括下面讨论的类)不是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)
字符串
,不使用文本作为其内部值,也没有“格式”。所有这些对象都可以生成和解析字符串以表示其日期时间值 java.time 现代方法使用java.time类取代了旧的遗留日期时间类,如
的使用应替换为java.util.Date
。两者都代表UTC中的一个时刻。java.time.Instant
使用纳秒而非毫秒的更精细分辨率 您可以轻松地在现代类和传统类之间进行转换。请注意,在本例中,在旧类中添加了新的转换方法 首先从转换为 NInstant
Instant instant = zdt.toInstant() ; // Extract an `Instant` object, always in UTC.
String output = instant.toString() ; // Generate string in standard ISO 8601 format.
- 日期时间对象没有“格式”。它们解析并生成以文本形式表示其值的