下面是解析日期的代码。我使用了'joda time:joda time:22.9.9'lib作为格式化程序。
String date = "Sun Sep 04 17:29:52 +0000 2022";
DateTimeFormatter dateFormat = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss Z
yyyy").withLocale(Locale.UK);
dateFormat.parseDateTime(date);
上面的代码在Android 12中引发了非法参数异常。当我将区域设置从英国更改为美国时,它开始工作。
但奇怪的是,如果我试图用上面的代码解析2016年3月23日星期三14:28:32+0000这个日期,它在所有操作系统中都可以工作。
令人费解的问题是,为什么一个日期得到了解析,而另一个却没有。
安卓12到底发生了什么变化,代码突然失效了?
Android 12中的实际变化是什么,代码突然变得失败?
早些时候, Sep 为了完整起见,我想讨论一下现代API。您可能已经在Joda-Time API的主页上看到了以下注释: 请注意,从Java SE 8开始,用户被要求迁移到Java.time(JSR-310(-JDK的核心部分,它取代了这个项目 使用现代日期时间API的演示: 输出: 请注意,我在演示中使用了 从跟踪:日期时间了解有关现代日期时间API的更多信息。Locale.UK
中九月的短名称为Sep,但从Java 16开始,它被更改为Locale.UK
中的其他短名称没有变化,因此它适用于2016年3月23日星期三14:28:32+0000。现代日期时间API
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String strDateTime = "Sun Sep 04 17:29:52 +0000 2022";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss Z yyyy", Locale.ROOT);
OffsetDateTime zdt = OffsetDateTime.parse(strDateTime, formatter);
System.out.println(zdt);
}
}
2022-09-04T17:29:52Z
Locale.ROOT
。如果您使用Locale.UK
,它将抛出与您得到的错误相同的错误。但是,如果将Sep更改为9t并使用Locale.UK
,它将起作用。
import java.text.SimpleDateFormat;
import java.util.Locale;
Locale locale = new Locale("bd", "bn");
String pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern, locale);
String date = simpleDateFormat.format(System.currentTimeMillis());
System.out.println("DateTime :: " + date);