是时候有人提供现代答案了。
OffsetDateTime now = OffsetDateTime.now(ZoneId.of("Africa/Cairo"));
String formatted = now.toString();
System.out.println(formatted);
这是刚刚打印出来的
2018-02-28T16:42:59.628526+02:00
编辑:我要求在秒上输入 3 位小数,而不是 6。 要对格式进行更多控制,请使用显式格式化程序:
DateTimeFormatter formatterWithThreeDecimals
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXXXX");
String formatted = now.format(formatterWithThreeDecimals);
System.out.println(formatted);
此打印(在我编辑时):
2018-04-30T15:47:41.749+02:00
如果不是非洲/开罗,请替换您想要的时区。为 JVM 的时区设置指定 ZoneId.systemDefault()。您的程序的其他部分或在同一 JVM 中运行的其他程序可以随时更改该设置。
使用现代 Java 日期和时间 API java.time,如果您只想要一个符合 ISO 8601 的输出并且不关心有多少小数(或者如果它们为 0,则是否打印秒),我们不根本不需要显式格式化程序。您所需的字符串采用 ISO 8601 格式,这是现代类的 toString 方法生成的标准格式。根据您的需要,toString 的结果可能会被接受。
您使用的类Date 和SimpleDateFormat 早已过时,而后者尤其是出了名的麻烦。我建议您避免使用它们并改用现代 API。使用起来感觉好多了。
如果您现在不想更改旧 API 中的 java.util.Date,请将其转换为现代的 Instant,然后从那里进行进一步的转换。在 Java 8 及更高版本中,情况如下:
ZonedDateTime dateTime = oldfashionedDateFromLegacyApi.toInstant()
.atZone(ZoneId.of("Africa/Cairo"));
String formatted = dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
如果您使用的是 ThreeTen Backport 和/或 ThreeTenABP,则转换发生的方式略有不同,如下所示:
ZonedDateTime dateTime = DateTimeUtils.toInstant(oldfashionedDateFromLegacyApi)
.atZone(ZoneId.of("Africa/Cairo"));
同样,如果您想严格控制输出格式,请不要使用 DateTimeFormatter.ISO_OFFSET_DATE_TIME,因为它会输出 1 到 9 位小数之间的任何内容,并且如果它们为 0,也可能会省略秒数。而是使用我的 formatterWithThreeDecimals从上面。
问题:我可以在 Android 上使用 java.time 吗?
是的,java.time 在 Android 上运行良好。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及更新的 Android 设备上,内置了现代 API。
- 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
- 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从
org.threeten.bp 导入日期和时间类以及子包。
链接