如何在日历中获得此日期格式

问题描述 投票:0回答:1

我必须使用此日期格式“ 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”,如您所见,我不需要其他符号。

java date calendar date-format xmlgregoriancalendar
1个回答
2
投票

日期对象没有格式

具有此日期格式的XMLGregorianCalendar对象

日期对象,例如XMLGregorianCalendar没有“格式”。它们在内部以某种方式表示日期时间值,尽管不太可能是文本形式。

您可以通过parsing文本实例化日期时间对象。您的日期时间对象可以generate表示其内部值的文本。但是文本和日期时间对象是不同的,并且彼此分开。

java.time

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 Answer

xgc.toString():2015-07-01T17:42:49 + 04:00


关于java.time

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日期时间类,例如legacyjava.util.Datejava.util.Date

要了解更多信息,请参见Calendar。并在Stack Overflow中搜索许多示例和说明。规格为Calendar

SimpleDateFormat项目现在位于SimpleDateFormat中,建议迁移到Oracle Tutorial类。

您可以直接与数据库交换java.time

对象。使用兼容JSR 310或更高版本的Joda-Time。不需要字符串,不需要maintenance mode类。

从哪里获取java.time类?

© www.soinside.com 2019 - 2024. All rights reserved.