在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上,这并不能很清楚你想要什么结果。
- 如果有任何方法可以,请跳过老式的类
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));
请注意使用明确的时区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
OffsetDateTime
的toString
方法为您提供所需的格式。 当然,如果您愿意,可以使用与以前相同的格式化程序。
如果截断到秒对你的品味有点过分作弊,你当然可以使用没有毫秒的格式化程序:
DateTimeFormatter isoNoSeconds = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX"); System.out.println(now.format(isoNoSeconds));
这将与ZonedDateTime
和OffsetDateTime
,即与上述两个片段一起使用。