问题描述
我正在调用一个soap网络服务,作为回应,我得到了一个日期,格式为 “2020-12-31T02:00:00+05:30”。
我想将其转换并显示为“31/12/2020,02:00 AM”。 我该怎么做?
我尝试了下面的代码,但它返回空值。
String pattern = "yyyy-MM-dd'T'HH:mm:ss z";
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
startDate= format.parse(eventStartDate);
} catch (ParseException e) {
e.printstacktrace();
}
任何帮助将不胜感激。 谢谢
解决方法
java.time 通过脱糖
考虑使用 java.time,现代 Java 日期和时间 API,用于您的日期和时间工作。下面的代码将几乎给你你所要求的(只有年份只有 2 位数字,时钟小时只有一位数字)。优点是我们使用的是内置格式,我们自己无需为任何格式模式而烦恼——这正是您遇到问题的部分。
DateTimeFormatter displayFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
String fromResponse = "2020-12-31T02:00:00+05:30";
OffsetDateTime startDateTime = OffsetDateTime.parse(fromResponse);
String displayDateTimeStr = startDateTime.atZoneSameInstant(ZoneId.systemDefault())
.format(displayFormatter);
System.out.println(displayDateTimeStr);
我使用 ThreeTen Backport 库(请参阅底部的链接)在桌面 Java 9 上运行代码,默认语言环境设置为 en-IN,默认时区设置为亚洲/加尔各答。输出是:
31/12/20,凌晨 2:00
如果您坚持使用四位数年份和两位数小时,请使用模式指定输出格式:
DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern(
"dd/MM/uuuu,hh:mm a",Locale.forLanguageTag("en-IN"));
31/12/2020,凌晨 02:00
我假设您的用户想要查看其时区的时间,因此我使用 atZoneSameInstant
的 OffsetDateTime
方法执行转换。
问题:java.time 不需要 Android API 级别 26 吗?
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,内置了现代 API。
- 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
- 在较旧的 Android 上,使用脱糖或 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保使用子包从
org.threeten.bp
导入日期和时间类。
您的代码出了什么问题?
您的格式模式字符串中有两个错误:
- 您在
ss
和z
之间有一个空格。在响应的字符串中,秒和时区偏移之间没有空格。这导致您的解析失败并显示java.text.ParseException: Unparseable date: "2020-12-31T02:00:00+05:30"
。如果您没有看到,则需要修复您的项目设置,以便显示e.printStackTrace();
的输出。 - 模式字母
z
不接受小时和分钟之间带有冒号的偏移量,正如您在+05:30
中得到的那样。对于旧的和麻烦的SimpleDateFormat
,正确的模式应该是大写的XXX
。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time。
-
Java Specification Request (JSR) 310,其中首次描述了
java.time
。 -
ThreeTen Backport project,将
java.time
向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。 - Java 8+ APIs available through desugaring
- ThreeTenABP,ThreeTen Backport 的 Android 版
- Question: How to use ThreeTenABP in Android Project,非常详尽的解释。
- Wikipedia article: ISO 8601