在Java中解析XML dateTime的最佳方法是什么?合法的dateTime值包括2002-10-10T12:00:00-05:00和2002-10-10T17:00:00Z。
是否有一个好的开源库可以使用,或者应该使用SimpleDateFormat或类似工具自己实现?
我认为你需要使用ISODateTimeFormat.dateTimeNoMillis()
,它来源于Joda Time。一般来说,我强烈建议你远离Java中内置的Date/Calendar类。Joda Time设计更好、更注重不可变性(尤其是格式化器是不可变的和线程安全的),并且是Java 7新日期/时间API的基础。
示例代码:
import org.joda.time.*;
import org.joda.time.format.*;
class Test
{
public static void main(String[] args)
{
parse("2002-10-10T12:00:00-05:00");
parse("2002-10-10T17:00:00Z");
}
private static final DateTimeFormatter XML_DATE_TIME_FORMAT =
ISODateTimeFormat.dateTimeNoMillis();
private static final DateTimeFormatter CHECKING_FORMAT =
ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);
static void parse(String text)
{
System.out.println("Parsing: " + text);
DateTime dt = XML_DATE_TIME_FORMAT.parseDateTime(text);
System.out.println("Parsed to: " + CHECKING_FORMAT.print(dt));
}
}
输出:
Parsing: 2002-10-10T12:00:00-05:00
Parsed to: 2002-10-10T17:00:00.000Z
Parsing: 2002-10-10T17:00:00Z
Parsed to: 2002-10-10T17:00:00.000Z
(请注意,在输出中,两者最终都变成了相同的UTC时间。输出格式使用UTC是因为我们使用withZone
调用要求这样做。)
XML_DATE_TIME_FORMAT = ISODateTimeFormat.dateTimeNoMillis().withOffsetParsed()
。 - Diego MedagliaInstant instant = Instant.parse( "2002-10-10T17:00:00Z" );
OffsetDateTime odt = OffsetDateTime.parse( "2002-10-10T12:00:00-05:00" );
其他答案是正确的,但现在已经过时。它们使用麻烦的旧类,现在已被java.time框架取代。
“XML dateTime”不存在。XML没有定义除文本之外的任何数据类型。
输入字符串恰好符合ISO 8601标准格式。因此,在解析/生成字符串时,无需指定格式模式,因为java.time类默认使用ISO 8601。
Instant
第二个输入字符串以Z
结尾,表示UTC。
Instant
类表示时间轴上的一个瞬间,以UTC为参考,精度为纳秒。
String input = "2002-10-10T17:00:00Z":
Instant instant = Instant.parse( input );
OffsetDateTime
第一个输入字符串包含与UTC的偏移量,因此我们将其解析为OffsetDateTime
。
String input = "2002-10-10T12:00:00-05:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );
ZonedDateTime
continent/region
的正确时区名称。永远不要使用那些不是真正的时区、没有标准化、甚至不是唯一的3-4个字母缩写。请注意保留HTML标签。ZoneId zoneId = ZoneId.of( "America/Cancun" );
ZonedDateTime zdt = odt.atZone( zoneId );
java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,如java.util.Date
、.Calendar
和java.text.SimpleDateFormat
。
Joda-Time项目现在处于维护模式,建议迁移到java.time。
要了解更多信息,请参见Oracle教程。并在Stack Overflow上搜索许多示例和解释。
许多java.time功能在ThreeTen-Backport中向Java 6和7进行了回溯,并在ThreeTenABP中进一步适用于Android。
ThreeTen-Extra项目通过添加额外的类扩展了java.time。该项目是java.time可能未来添加的新功能的试验场。您可能会在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
等。
查看解析和格式化dateTime值,不过:
http://xmlbeans.apache.org/samples/DateTime.html
有一个XmlDateTime类。只需执行XMLDateTime.stringToDate(xmlDateTime)。
javax.xml.datatype.DatatypeFactory
中使用newXMLGregorianCalendar,这将使你拥有详细的控制权,包括检测时区是否已指定。javax.xml.datatype.DatatypeFactory
的实现?我唯一找到的是在xerces2中...我以为xerces2已经过时了...(我离开Java有一段时间了) - denishaskinXmlDateTime.Factory.parse(dateTimeString)
,但这很笨拙,因为它期望一个带有开始和结束标记的元素,如<mytime>2011-10-20T15:07:14.112-07:00</mytime>
更简单的方法是调用(new org.apache.xmlbeans.GDate(dateTimeString)).getDate()
。