我需要以这种格式定义日期 1999-05-31T13:20:00-05:00
我正在使用下面的代码
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD'T'hh:mm:ssZ");
sdf.setTimeZone(TimeZone.getTimeZone("EST"));
String date = sdf.format(new Date());
System.out.println(date);
Run Code Online (Sandbox Code Playgroud)
但是它以格式生成日期2017-04-117T08:28:46-0500(在时区中缺少分号)
定义日期后,我必须创建一个具有相同日期的XMLGregorianCalendar实例.
我很惊讶你在搜索时没找到答案.无论如何,这很容易.但首先要提醒两句:
SimpleDateFormat,TimeZone和Date.新课程java.time通常可以更好地使用.您要求的格式正是DateTimeFormatter.ISO_OFFSET_DATE_TIME给您的.如果您打算为东部时区的用户设置适当的格式,请使用:
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/New_York"))
.truncatedTo(ChronoUnit.SECONDS);
System.out.println(now.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
Run Code Online (Sandbox Code Playgroud)
请注意使用明确的时区ID和上述格式化程序.格式将打印毫秒(甚至更小),如果有的话,你没有要求.所以我有点作弊:我把时间缩短到整秒.现在打印的内容如下:
2017-04-27T10:11:33-04:00
Run Code Online (Sandbox Code Playgroud)
如果你想要偏移-05:00,那就更容易了:
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.ofHours(-5))
.truncatedTo(ChronoUnit.SECONDS);
System.out.println(now);
Run Code Online (Sandbox Code Playgroud)
这会打印相同格式的内容,但具有所需的偏移量:
2017-04-27T09:11:33-05:00
Run Code Online (Sandbox Code Playgroud)
该toString方法OffsetDateTime为您提供所需的格式.当然,如果您愿意,可以使用与以前相同的格式化程序.
如果截断到秒对你的品味有点过分作弊,你当然可以使用没有毫秒的格式化程序:
DateTimeFormatter isoNoSeconds = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX");
System.out.println(now.format(isoNoSeconds));
Run Code Online (Sandbox Code Playgroud)
这将同时适用于a ZonedDateTime和a OffsetDateTime,即上述两个片段.