如何在日历中实现这种日期格式

How to achive this date format in calendar

我必须使用这种日期格式创建 XMLGregorianCalendar 对象 "YYYY-MM-DDTHH:MI:SS±TZ" 例如“2015-07-01T17:42:49+04”

我不知道该怎么做。我使用了多种方法来转换日期,但这种模式似乎不起作用。

经过一些实验,我发现 "YYYY-MM-dd'T'HH:mm:ssX" 会给我想要的输出。但它是一个字符串,我无法使用 XMLGregorianCalendar 实现相同的格式。

它给了我“2015-07-01T17:42:4234+05:00”,如您所见,还有我不需要的其他符号。

日期时间对象没有格式

XMLGregorianCalendar object with this date format

XMLGregorianCalendar 等日期时间对象没有“格式”。它们以某种方式在内部表示日期时间值,但不太可能在文本中。

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

java.time

XMLGregorianCalendar class 现已过时。由 JSR 310 中定义的现代 java.time classes 补充。

将您的输入字符串解析为 OffsetDateTime,因为其中包含与 UTC 的偏移量,但不包含时区。

OffsetDateTime odt = OffsetDateTime.parse( "2015-07-01T17:42:49+04" );

以标准 ISO 8601 格式生成文本。

String output = odt.toString() ;  // Generates text in ISO 8601 format.

2015-07-01T17:42:49+04:00

部分偏移量

末尾的部分是与 UTC 的偏移量,即本初子午线之前或之后的小时-分钟-秒数。在 ISO 8601 中,加号是一个正数,表示 UTC 的 ahead。减号是一个负数,表示 落后于 UTC。

抑制部分偏移量

有些人可能会在零时去掉秒,或者在零时去掉分钟。但隐藏这些数字不会改变其含义。这三个字符串都代表同一时刻:

  • 2015-07-01T17:42:49+04
  • 2015-07-01T17:42:49+04:00
  • 2015-07-01T17:42:49+04:00:00

你说:

"2015-07-01T17:42:4234+05:00", as you see there're additional symbols that i don't need.

[我假设你的意思是 "2015-07-01T17:42:49+04:00" 但打错了。]

你真的不应该关心这个。事实上,我建议您始终包括小时和分钟,因为我看到多个 libraries/protocols 需要小时和分钟,如果省略则中断。虽然分钟和秒在 ISO 8601 中确实是可选的,当它们的值为零时,我建议你总是在零时包括分钟。

DateTimeFormatter

如果您坚持不这样做,您将需要使用 DateTimeFormatter class,并且可能 DateTimeFormatterBuilder 来抑制零时的分钟数。也许是这样的:

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssx" );
String output = odt.format( f );

2015-07-01T17:42:49+04

如果分钟和秒的值为零,则该格式化模式中的 x 代码会抑制它们。

如果您自己进行格式化,请确保在非零时不要截断,否则您的结果将是错误的(不同的时刻)。举个例子,代表这个时刻在印度看到的,当前使用的偏移量是五个半小时(一个偏移量包括 30 分钟而不是零)。

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );
OffsetDateTime odtKolkata = zdt.toOffsetDateTime();

转储到控制台。

System.out.println( "odtKolkata = " + odtKolkata );

2015-07-01T19:12:49+05:30

XMLGregorianCalendar

如果您绝对必须使用旧的遗留 class XMLGregorianCalendar,您可以从上面代码中看到的 OffsetDateTime 对象的 ISO 8601 输出创建一个。参见另一个问题的 this Answer

XMLGregorianCalendar xgc = null;
try
{
    xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar( odt.toString() );
}
catch ( DatatypeConfigurationException e )
{
    e.printStackTrace();
}
System.out.println( "xgc.toString(): " + xgc );

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


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

您可以直接与数据库交换 java.time 对象。使用 JDBC driver compliant with JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* classes.

从哪里获得java.time classes?