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中的SimpleDateFormat ( yyyy-MM-dd'T'HH:mm:ss.SSSXXX
)或使用Joda的DateTimeFormat ( yyyy-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));