我正在调用一个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();
}
任何帮助将不胜感激。 谢谢
答案 0 :(得分:1)
考虑使用 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 设备上都能很好地工作。它只需要至少 Java 6。
org.threeten.bp
导入日期和时间类。您的格式模式字符串中有两个错误:
ss
和 z
之间有一个空格。在响应的字符串中,秒和时区偏移之间没有空格。这导致您的解析失败并显示 java.text.ParseException: Unparseable date: "2020-12-31T02:00:00+05:30"
。如果您没有看到,则需要修复您的项目设置,以便显示 e.printStackTrace();
的输出。z
不接受小时和分钟之间带有冒号的偏移量,正如您在 +05:30
中得到的那样。对于旧的和麻烦的 SimpleDateFormat
,正确的模式应该是大写的 XXX
。java.time
。java.time
向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。