我想贡献现代答案。虽然SimpleDateFormat
是我们在 2013 年用于解析和格式化日期时间的类(除了 Joda-Time),但它现在已经过时了,而且我们在 JSR-310 或 JSR-310 中拥有更好的java.time
功能,这是现代 Java 日期和时间 API 2014 年推出 Java 8。
但我听到你说,大多数 Android 设备仍然不运行 Java 8。幸运的是,您仍然可以通过 ThreeTenABP(JSR-310 到 Android Java 7 的反向移植)在它们上使用现代 Java 日期和时间 API。详细信息在这个问题中:如何在 Android 项目中使用 ThreeTenABP。
现在代码是:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH);
String aDate = "Jul 16, 2013 12:08:59 AM";
String formattedDate = LocalDateTime.parse(aDate, formatter)
.atOffset(ZoneOffset.UTC)
.atZoneSameInstant(ZoneId.systemDefault())
.format(formatter);
System.out.println(formattedDate);
由于我的计算机运行的是欧洲/哥本哈根时区,在 7 月比 UTC 早 2 小时,因此打印
Jul 16, 2013 02:08:59 AM
进一步的要点:
- 由于您的字符串中有 AM,我假设您的时间在 AM 内,从 1 到 12。要正确解析和格式化它们,您需要
h
在格式模式字符串中使用小写字母。大写H
表示从 0 到 23 的小时。
- 更喜欢为格式化程序提供明确的语言环境(无论是
SimpleDateFormat
还是DateTimeFormatter
)。如果没有给出语言环境,格式化程序将使用设备的默认语言环境。“Jul”和“AM”是英文的,你的代码可能在许多设备上运行良好,直到有一天它在非英语语言环境的设备上运行并崩溃,你很难弄清楚原因。
- 如果可以,请明确给出所需的时区,例如
ZoneId.of("Asia/Kolkata")
. JVM 的默认时区可能会被您程序的其他部分或在同一 JVM 中运行的其他程序更改,因此不可靠。