我有一个Calendar实例,它是javax.xml.bind.DatatypeConverter.parseDateTime通过JAXB 的方法从XSD datetime解析的。
javax.xml.bind.DatatypeConverter.parseDateTime
在运行时,我在Web服务中,我想知道原始的xsd日期时间是否有效(根据月… ect,月<12,日<31、30、29、28)。示例:这是一个有效日期:2015-07-30T09:32:05.543+02:00而不是:2015-07-35T09:32:05.543+02:00
2015-07-30T09:32:05.543+02:00
2015-07-35T09:32:05.543+02:00
我尝试setLenient在Web服务中的实例上使用,但是当原始日期错误时,它似乎没有引发异常。
setLenient
有什么办法吗?我的猜测是告诉JAXB在global.jaxb文件中以正确的方式进行操作,这是我现在使用的一种方式:
global.jaxb
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema" jaxb:extensionBindingPrefixes="xjc"> <jaxb:globalBindings> <xjc:simple/> <xjc:serializable uid="-1"/> <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime"/> </jaxb:globalBindings> </jaxb:bindings>
任何帮助,将不胜感激。谢谢。
OffsetDateTime.parse( "2015-07-35T09:32:05.543+02:00" ) … catch ( DateTimeParseException e )
麻烦的旧日期,时间类,如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8的Java 9班。
java.util.Date
java.util.Calendar
java.text.SimpleDateFormat
同样,Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。
OffsetDateTime
DateTimeParseException
要确定无效的日期时间字符串,请尝试分析和捕获异常。假设您的输入具有与UTC的偏移量,但没有时区,则将其解析为OffsetDateTime对象。无效的输入throw DateTimeParseException。
String inputGood = "2015-07-30T09:32:05.543+02:00" ; String inputBad = "2015-07-35T09:32:05.543+02:00" ; try{ // Good OffsetDateTime odtGood = OffsetDateTime.parse( inputGood ) ; System.out.println( "odtGood.toString(): " + odtGood ) ; // Bad OffsetDateTime odtBad = OffsetDateTime.parse( inputBad ) ; System.out.println( "odtBad.toString(): " + odtBad ) ; } catch ( DateTimeParseException e ) { System.out.println( e ) ; }
请参阅在IdeOne.com上实时运行的代码。
odtGood.toString():2015-07-30T09:32:05.543 + 02:00 java.time.format.DateTimeParseException:无法解析文本‘2015-07-35T09:32:05.543 + 02:00’:DayOfMonth的值无效(有效值1-28/31):35
odtGood.toString():2015-07-30T09:32:05.543 + 02:00
java.time.format.DateTimeParseException:无法解析文本‘2015-07-35T09:32:05.543 + 02:00’:DayOfMonth的值无效(有效值1-28/31):35
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat。
Calendar
SimpleDateFormat
现在处于维护模式的Joda- Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
在哪里获取java.time类?
该 ThreeTen-额外 项目与其他类扩展java.time。该项目是将来可能向java.time添加内容的试验场。你可能在这里找到一些有用的类,比如Interval,YearWeek,YearQuarter,和更多。
Interval
YearWeek
YearQuarter