字符串日期到xmlgregoriancalendar转换

我写过这个函数:

public static XMLGregorianCalendar getXMLGregorianCalendar(String date) throws OmniException{ XMLGregorianCalendar xmlCalender=null; GregorianCalendar calender = new GregorianCalendar(); calender.setTime(Util.stringToJavaDate(date)); xmlCalender = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender); return xmlCalender; } public static Date stringToJavaDate(String sDate) throws OmniException{ Date date=null; date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(sDate); return date; } 

当我将日期作为"2014-01-07"传递时,我的输出日期为2014-01-06T18:30:00:000Z我哪里出错了? 如果我只想获得2014-01-06T18:30:002014-01-06T18:30:00Z该怎么办
任何帮助表示赞赏

找到解决方案如下….发布它,因为它可以帮助其他人:)

 DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date date = format.parse("2014-04-24 11:15:00"); GregorianCalendar cal = new GregorianCalendar(); cal.setTime(date); XMLGregorianCalendar xmlGregCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal); System.out.println(xmlGregCal); 

输出:

2014-04-24T11:15:00.000 + 02:00

对我来说,最优雅的解决方案就是这个:

 XMLGregorianCalendar result = DatatypeFactory.newInstance() .newXMLGregorianCalendar("2014-01-07"); 

使用Java 8。

扩展示例:

 XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar("2014-01-07"); System.out.println(result.getDay()); System.out.println(result.getMonth()); System.out.println(result.getYear()); 

打印出:

 7 1 2014 
 GregorianCalendar c = GregorianCalendar.from((LocalDate.parse("2016-06-22")).atStartOfDay(ZoneId.systemDefault())); XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); 

TL;博士

 LocalDate.parse( "2014-01-07" ) .atStartOfDay( ZoneId.of( "America/Montreal" ) ) .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) .replace( "T" , " " ) 

2014-01-07 00:00:00

日期时间!=字符串

不要将日期时间值与其文本表示混淆。 我们解析字符串以获取日期时间对象,并且我们要求date-time对象生成一个字符串来表示其值。 日期时间对象没有“格式”,只有字符串具有格式。

因此,将您的思维转变为两种不同的模式:模型和演示。 确定您所考虑的日期值,并应用适当的时区作为模型。 当您需要显示该值时,请按照用户的预期生成特定格式的字符串。

避免遗留日期时间类

问题和其他答案都使用现在由java.time类取代的旧麻烦的日期时间类。

ISO 8601

输入字符串"2014-01-07"采用标准ISO 8601格式。

中间的T将日期部分与时间部分分开。

最后的Z是Zulu的缩写,意思是UTC 。

幸运的是,java.time类在解析/生成字符串时默认使用ISO 8601格式。 因此无需指定格式化模式。

LocalDate

LocalDate类表示没有时间且没有时区的仅日期值。

 LocalDate ld = LocalDate.parse( "2014-01-07" ) ; 

ld.toString():2014-01-07

ZonedDateTime的一天ZonedDateTime

如果要查看当天的第一个时刻,请指定ZoneId时区以获取时间轴上的时刻,即ZonedDateTime 。 时区至关重要,因为日期因地区而异。 在巴黎午夜过后几分钟,法国是新的一天,而在魁北克蒙特利尔仍然是“昨天”。

永远不要假设这一天从00:00:00开始。 夏令时(DST)等exception表示日期可能在另一个时间点开始,例如01:00:00。 让java.time确定第一时刻。

 ZoneId z = ZoneId.of( "America/Montreal" ) ; ZonedDateTime zdt = ld.atStartOfDay( z ) ; 

zdt.toString():2014-01-07T00:00:00Z

对于所需的格式,使用预定义的格式化程序DateTimeFormatter.ISO_LOCAL_DATE_TIME生成一个字符串,然后用SPACE替换中间的T

 String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) .replace( "T" , " " ) ; 

2014-01-07 00:00:00


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。