String timeToConvert = "2018-06-25T08:06:52Z";
Instant inst = Instant.parse(timeToConvert);
LocalTime time = inst.atZone(ZoneId.of("Africa/Nairobi"))
.toLocalTime()
.truncatedTo(ChronoUnit.MINUTES);
System.out.println("Time in Nairobi: " + time);
这打印:
内罗毕时间:11:06
我在用java.time
,在本例中是向后移植到 Java 6 和 7。此向后移植也可在 Android 版本中使用,您可以将其用于较低的 Android API 级别。我的进口是:
import org.threeten.bp.Instant;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.temporal.ChronoUnit;
如果您需要需要此格式的 API 的时间字符串,那就没问题。如果您需要向用户展示时间字符串,请考虑使用 Java 的内置格式:
DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
ZonedDateTime dateTime = inst.atZone(ZoneId.of("Africa/Nairobi"));
System.out.println("Formatted: " + dateTime.format(timeFormatter));
我尝试在斯瓦希里语(sw_KE)语言环境中运行它并得到:
格式:上午 11:06
显然,这个语言环境使用英语 AM/PM 方式来表示时间(我在基库尤语和卡伦津语语言环境中得到了相同的结果)。在英国语言环境中,我得到与以前相同的格式:
格式:11:06
我正在使用和建议java.time
,现代 Java 日期和时间 API。对于任何阅读并使用 Java 8 或更高版本或针对 Android API 级别 26 或更高级别进行编程的人,您不需要提到的向后移植。只需从以下位置导入内置的日期时间类java.time
用子包代替上面提到的。
你的代码出了什么问题?
您的错误来自硬编码Z
在日期时间字符串中作为文字。它的 UTC 偏移量为零,当您不这样解析它时,日期时间字符串将在您所在的时区进行解析SimpleDateFormat
, Africa/Nairobi,这对于您的字符串来说是不正确的。
恕我直言,你不应该想使用SimpleDateFormat
, TimeZone
and Date
但无论如何。这些类早已过时,尤其是第一个类已被证明很麻烦。我总是用java.time
反而。
另一个提示:不要接受异常。不要离开你的catch
块空。以某种明显的方式报告异常。这是您发现代码中何时出现问题的机会。
Links
-
Oracle 教程:日期时间 https://docs.oracle.com/javase/tutorial/datetime/解释如何使用
java.time
.
-
Java 规范请求 (JSR) 310 https://jcp.org/en/jsr/detail?id=310, where
java.time
首次被描述。
-
ThreeTen 后移植项目 http://www.threeten.org/threetenbp/,向后移植
java.time
到 Java 6 和 7(JSR-310 为 ThreeTen)。
-
三十ABP https://github.com/JakeWharton/ThreeTenABP, Android 版 ThreeTen Backport
-
问题:如何在Android项目中使用ThreeTenABP https://stackoverflow.com/questions/38922754/how-to-use-threetenabp-in-android-project,有非常详尽的解释。
- 维基百科文章:ISO 8601 https://en.wikipedia.org/wiki/ISO_8601