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

dwbf0jvd  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(384)

我必须用这个日期格式“yyyy-mm”创建xmlgregoriancalendar对象-ddthh:mi:秒±tz“例如”2015-07-01t17:42:49+04“
我不知道怎么做。我已经用了很多方法来转换日期,但是这个模式似乎不起作用。
经过一些实验后,我发现“yyyy-mm-dd't'hh:mm:ssx”将提供所需的输出。但是它是一个字符串,我不能用xmlgregoriancalendar实现相同的格式。
它给了我“2015-07-01t17:42:4234+05:00”,正如你看到的,我不需要额外的符号。

kqlmhetl

kqlmhetl1#

日期时间对象没有格式

具有此日期格式的xmlgregoriancalendar对象
日期时间对象,例如 XMLGregorianCalendar 没有“格式”。它们以某种方式在内部表示日期时间值,但不太可能在文本中。
可以通过解析文本来示例化日期时间对象。日期时间对象可以生成表示其内部值的文本。但是文本和日期时间对象是不同的,彼此独立。

java.time文件

这个 XMLGregorianCalendar 类现在已过时。被jsr 310中定义的现代java.time类所取代。
将输入字符串解析为 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的偏移量,即本初子午线前后的小时分秒数。在ISO8601中,加号是一个表示utc之前的正数。减号是一个负数,表示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”,如您所见,我不需要其他符号。
[我想你是真的 "2015-07-01T17:42:49+04:00" 但打错了字。]
你真的不应该关心这个。事实上,我建议您总是同时包含小时和分钟,因为我已经看到多个库/协议都需要小时和分钟,如果省略,就会中断。虽然在ISO8601中,当分和秒的值为零时,它们确实是可选的,但我建议您始终包括零时的分和秒。

日期时间格式

如果你坚持不这样做,你将需要使用 DateTimeFormatter 类,可能还有 DateTimeFormatterBuilder ,以抑制零时的分钟数。也许是这样的:

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

2015-07-01t17:42:49+04
这个 x 格式模式中的代码抑制了分钟和秒(如果它们的值为零)。
如果你自己格式化,一定不要在非零时截断,否则你的结果会是错误的(不同的时刻)。以印度为例,当前使用的偏移量是5个半小时(包括30分钟而不是0分钟的偏移量)。

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格式

如果您必须使用旧的遗留类 XMLGregorianCalendar ,您可以从我们的 OffsetDateTime 上面代码中看到的对象。请看另一个问题的答案。

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框架内置于Java8及更高版本中。这些类取代了旧的遗留日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .
要了解更多信息,请参阅oracle教程。和搜索堆栈溢出的许多例子和解释。规格为jsr 310。
现在处于维护模式的joda time项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合jdbc 4.2或更高版本的jdbc驱动程序。不需要线,不需要线 java.sql.* 班级。
从哪里获得java.time类?
JavaSE8、JavaSE9、JavaSE10、JavaSE11及更高版本—标准JavaAPI的一部分,带有捆绑实现。
Java9添加了一些次要的特性和修复。
java se 6和java se 7
大部分java.time功能都是通过三个十个后端口后端口移植到Java6和Java7的。
安卓
android包java.time类的更高版本实现。
对于早期的android(<26),threetenabp项目采用了threeten backport(如上所述)。了解如何使用threetenabp…。

相关问题