在java中我需要以这种格式定义日期1999-05-31T13:20:00-05:00

我需要以这种格式定义日期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); 

但是生成日期的格式为2017-04-117T08:28:46-0500 (在时区中缺少分号)

定义日期后,我必须创建具有相同日期的XMLGregorianCalendar实例。

我很惊讶你在搜索时没找到答案。 无论如何,这很容易。 但首先要注意两句话:

  • 跳过三个字母的时区缩写。 许多人都很暧昧。 虽然我认为EST只意味着东部标准时间,但这不是一个完整的时区,因为(大部分?)该区域现在在EDT上,这并不能很清楚你想要什么结果。
  • 如果有任何方法可以,请跳过老式的类SimpleDateFormatTimeZoneDatejava.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)); 

请注意使用明确的时区ID和上述格式化程序。 格式将打印毫秒(甚至更小),如果有的话,你没有要求。 所以我有点作弊:我把时间缩短到整秒。 现在打印出如下内容:

 2017-04-27T10:11:33-04:00 

如果你想要偏移-05:00 ,那就更容易了:

  OffsetDateTime now = OffsetDateTime.now(ZoneOffset.ofHours(-5)) .truncatedTo(ChronoUnit.SECONDS); System.out.println(now); 

这会以相同的格式打印某些内容,但具有所需的偏移量:

 2017-04-27T09:11:33-05:00 

OffsetDateTimetoString方法为您提供所需的格式。 当然,如果您愿意,可以使用与以前相同的格式化程序。

如果截断到秒对你的品味有点过分作弊,你当然可以使用没有毫秒的格式化程序:

  DateTimeFormatter isoNoSeconds = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX"); System.out.println(now.format(isoNoSeconds)); 

这将与ZonedDateTimeOffsetDateTime ,即与上述两个片段一起使用。