字符串日期到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:00
和2014-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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。