我必须使用此日期格式“ YYYY-MM-DDTHH:MI:SS±TZ”创建XMLGregorianCalendar对象,例如“ 2015-07-01T17:42:49 + 04”
我不知道该怎么做。我已经使用了多种方法来转换日期,但是这种模式似乎不起作用。
[经过一些实验,我发现“ YYYY-MM-dd'T'HH:mm:ssX”将为我提供所需的输出。但这是一个字符串,使用XMLGregorianCalendar无法实现相同的格式。
它给了我“ 2015-07-01T17:42:4234 + 05:00”,如您所见,我不需要其他符号。
具有此日期格式的XMLGregorianCalendar对象
日期对象,例如XMLGregorianCalendar
没有“格式”。它们在内部以某种方式表示日期时间值,尽管不太可能是文本形式。
您可以通过parsing文本实例化日期时间对象。您的日期时间对象可以generate表示其内部值的文本。但是文本和日期时间对象是不同的,并且彼此分开。
XMLGregorianCalendar
类现在已过时。由JSR 310中定义的现代java.time类代替。
将输入字符串解析为XMLGregorianCalendar
,如其中所示,包含从UTC的偏移量,但不包含时区。
OffsetDateTime
以标准OffsetDateTime odt = OffsetDateTime.parse( "2015-07-01T17:42:49+04" );
格式生成文本。
ISO 8601
2015-07-01T17:42:49 + 04:00
末尾的部分是自UTC的偏移量,即在本初子午线之前或之后数小时-分钟-秒。在ISO 8601中,加号是一个正数,表示UTC的ahead]。减号是一个负数,表示behind UTC。
某些人可能在零时减少秒,在零时减少分钟。但是抑制这些数字不会改变含义。这三个字符串都表示同一时刻:
String output = odt.toString() ; // Generates text in ISO 8601 format.
2015-07-01T17:42:49+04
2015-07-01T17:42:49+04:00
您说:
“” 2015-07-01T17:42:4234 + 05:00“,如您所见,我不需要其他符号。
[[我想你真的是说
2015-07-01T17:42:49+04:00:00
,但打错了字。]
您真的不应该在乎这个。确实,我建议您始终同时包括小时和分钟,因为我已经看到了多个期望小时和分钟的库/协议,如果省略则会中断。当分钟和秒的值实际上为零时,在ISO 8601中确实是可选的,但我建议您始终将分钟为零。
"2015-07-01T17:42:49+04:00"
[否则,您将需要使用DateTimeFormatter
类,并且可能需要使用DateTimeFormatter
来抑制分钟为零。也许这样:
DateTimeFormatterBuilder
2015-07-01T17:42:49 + 04
该格式模式中的DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssx" );
String output = odt.format( f );
代码抑制了分钟和秒,如果它们的值为零。
如果进行自己的格式化,请确保在非零时不要截断,否则结果将是虚假的(不同的时刻)。以代表印度在这一时刻为例,当前使用的偏移量为五个半小时(偏移量包括30分钟而不是零)。
x
转储到控制台。
ZoneId z = ZoneId.of( "Asia/Kolkata" ); ZonedDateTime zdt = odt.atZoneSameInstant( z ); OffsetDateTime odtKolkata = zdt.toOffsetDateTime();
2015-07-01T19:12:49 + 05:30
System.out.println( "odtKolkata = " + odtKolkata );
如果绝对必须使用旧的旧类XMLGregorianCalendar
,则可以从上面代码中看到的XMLGregorianCalendar
对象的ISO 8601输出中创建一个。参见OffsetDateTime
关于另一个问题。
this Answerxgc.toString():2015-07-01T17:42:49 + 04:00
XMLGregorianCalendar xgc = null;
try
{
xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar( odt.toString() );
}
catch ( DatatypeConfigurationException e )
{
e.printStackTrace();
}
System.out.println( "xgc.toString(): " + xgc );
框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacy,java.util.Date
和java.util.Date
。
要了解更多信息,请参见Calendar
。并在Stack Overflow中搜索许多示例和说明。规格为Calendar
。
SimpleDateFormat
项目现在位于SimpleDateFormat
中,建议迁移到Oracle Tutorial类。
您可以直接与数据库交换java.time
对象。使用兼容JSR 310或更高版本的Joda-Time。不需要字符串,不需要maintenance mode类。从哪里获取java.time类?
java.sql.*
和更高版本-具有捆绑实施的标准Java API的一部分。