Java SimpleDateFormat时区偏移,以分号分隔冒号

如何使用SimpleDateFormat将我的日期格式化为2012-11-25T23:50:56.193+01:00
如果我在格式中使用Z

yyyy-MM-dd'T'hh:mm:ss.SSSZ

然后它显示

2013-03-06T11:49:05.490+0100

您可以使用Java 7中SimpleDateFormatyyyy-MM-dd'T'HH:mm:ss.SSSXXX )或使用JodaDateTimeFormatyyyy-MM-dd'T'HH:mm:ss.SSSZZ )获取格式为+01:00的时区偏移量yyyy-MM-dd'T'HH:mm:ss.SSSZZ )。

这是2017年的答案。 如果有任何方法可以(有),抛弃像SimpleDateFormat这样的过时类,并使用java.time的现代和更方便的类。 特别是,所需的格式2012-11-25T23:50:56.193+01:00符合ISO-8601,因此开箱即用的新类,只需使用OffsetDateTime.toString()

  OffsetDateTime time = OffsetDateTime.now(); System.out.println(time.toString()); 

这打印出类似的东西

 2017-05-10T16:14:20.407+02:00 

但是,您可能想知道或者可能不想知道的一件事是,它会在秒数上打印出与在OffsetDateTime对象中打印精度所需的3 OffsetDateTime数组。 显然在我的电脑上“now”带有毫秒精度(三位小数秒)。

例如,如果你有一个老式的Date对象,你通过调用一些遗留方法得到它,我建议你做的第一件事是将它转换为Instant ,这是现代类之一。 从那里您可以根据您的要求轻松进行其他转换:

  Date now = new Date(); OffsetDateTime time = now.toInstant().atZone(ZoneId.systemDefault()).toOffsetDateTime(); System.out.println(time.toString()); 

我真的做了比必要更多的转换。 atZone(ZoneId.systemDefault())产生了一个ZonedDateTime ,它的toString()并不总能给你你想要的格式; 但它可以很容易地格式化:

  ZonedDateTime time = now.toInstant().atZone(ZoneId.systemDefault()); System.out.println(time.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));