我想提供现代的答案。虽然我们在2013年(除了Joda-Time)用于解析和格式化日期时间的课程,但它现在已经过时了,我们在JSR-310中已经有了更好的功能,JSR-310是2014年Java 8推出的现代Java日期和时间API。SimpleDateFormat
java.time
但是大多数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。要正确解析和格式化它们,您需要在格式模式字符串中使用小写字母。大写表示一天中从 0 到 23 的小时。
h
H
- 首选为格式化程序提供 explcit 语言环境(无论是 还是 )。如果未指定区域设置,则格式化程序将使用设备的默认区域设置。“Jul”和“AM”是英文的,你的代码可能会在许多设备上运行得很好,直到有一天它在具有非英语区域设置的设备上运行并崩溃,你很难弄清楚原因。
SimpleDateFormat
DateTimeFormatter
- 如果可以,请明确给出所需的时区,例如 .JVM 的默认时区可能会被程序的其他部分或在同一 JVM 中运行的其他程序更改,因此不可靠。
ZoneId.of("Asia/Kolkata")