Java Android Studio-使用Android 10的Physycal设备上出现不可解析的日期错误
这部分代码将输入从“2020年1月1日”转换为“01/01”。整个代码可以完美地在Android设备上运行到Pie,在AVD设备上运行到Q和R。当我试着用安卓Q在Physycal安卓设备上运行它时,它不会运行(我试过用两种不同的设备:Mi Note 10和OnePlus 6T)。我在调试器上做了一次检查,当它进入IF循环时,我发现了这个错误(我认为在指令中:@SuppressLint(“SimpleDataFormat”)SimpleDataFormat dt=new SimpleDataFormat(“E MMM dd HH:mm:ss z yyyy”) W/System.err:java.text.ParseException:不可解析的日期:“Thu Nov 05 00:00:00 GMT+01:00 2020”Java Android Studio-使用Android 10的Physycal设备上出现不可解析的日期错误,android,android-studio,date,simpledateformat,android-10.0,Android,Android Studio,Date,Simpledateformat,Android 10.0,这部分代码将输入从“2020年1月1日”转换为“01/01”。整个代码可以完美地在Android设备上运行到Pie,在AVD设备上运行到Q和R。当我试着用安卓Q在Physycal安卓设备上运行它时,它不会运行(我试过用两种不同的设备:Mi Note 10和OnePlus 6T)。我在调试器上做了一次检查,当它进入IF循环时,我发现了这个错误(我认为在指令中:@SuppressLint(“SimpleDataFormat”)SimpleDataFormat dt=new SimpleDataFor
String[]mese=新字符串[]{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
int a=0;
而(a<12){
if(dato.contains(mese[a]){
系统输出打印项次(“测试3”);
DateFormat格式=新的SimpleDateFormat(“MMMM d,yyyy”,Locale.ENGLISH);
日期=format.parse(dato);
@SuppressLint(“SimpleDataFormat”)SimpleDataFormat dt=新的SimpleDataFormat(“E MMM dd HH:mm:ss z yyyy”);
Date date2=dt.parse(String.valueOf(Date));
@SuppressLint(“SimpleDataFormat”)SimpleDataFormat dt1=新SimpleDataFormat(“dd/MM”);
断言日期2!=null;
dato=dato.replaceAll(dato,dt1.format(date2));
}
a++;
}
我的模式错误?我尝试了EEE MMM dd HH:mm:ss zzz yyyy和EEE MMM dd HH:mm:ss zzzz yyyy,但结果相同java.time和desugaring或ThreeTenABP
我建议您使用java.time(现代java日期和时间API)进行日期工作
java.time格式化程序是线程安全的,因此我们通常更喜欢将其声明为静态:
private static final DateTimeFormatter sourceFormatter
= DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
private static final DateTimeFormatter targetFormatter
= DateTimeFormatter.ofPattern("dd/MM");
现在,您的转换如下所示:
String dato = "November 5, 2020";
LocalDate date = LocalDate.parse(dato, sourceFormatter);
dato = date.format(targetFormatter);
System.out.println(dato);
输出:
2011年5月
你的代码出了什么问题?
在我看来,您正在以一种比需要更复杂的方式进行格式转换。与其检查字符串中是否有月份名称,为什么不尝试解析它呢?如果没有,我的代码将抛出一个DateTimeParseException
,然后您可以捕获该异常并以适合您自己的方式进行处理情况。您的代码正在将字符串
转换为日期
转换为字符串
再转换为日期
,再转换为字符串
。我不明白原因。另外,您正在使用SimpleDataFormat
类。这是出了名的麻烦和过时很久的。您第二次从解析字符串
到日期
失败,我敢打赌我知道原因:对于第一个SimpleDateFormat
,您记得指定Locale.ENGLISH
,但是您忘记了第二个SimpleDateFormat
。字符串包含英语的Thu
和Nov
,因此如果您的Android Q和R设备有不同的nt语言设置,这就解释了。最后,出于您的目的,这一行:
dato = dato.replaceAll(dato,dt1.format(date2));
与更简单的相同:
dato = dt1.format(date2);
问:java.time不需要Android API级别26吗?
java.time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
- 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
- 在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。后者称为ThreeTenABP。使用ThreeTenABP时,请确保从
及其子包导入日期和时间类org.ThreeTen.bp
- 解释如何使用java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻
- 类似问题:
private static final DateTimeFormatter sourceFormatter
= DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
private static final DateTimeFormatter targetFormatter
= DateTimeFormatter.ofPattern("dd/MM");
现在,您的转换如下所示:
String dato = "November 5, 2020";
LocalDate date = LocalDate.parse(dato, sourceFormatter);
dato = date.format(targetFormatter);
System.out.println(dato);
输出:
2011年5月
你的代码出了什么问题?
在我看来,您正在以一种比需要更复杂的方式进行格式转换。与其检查字符串中是否有月份名称,为什么不尝试解析它呢?如果没有,我的代码将抛出一个DateTimeParseException
,然后您可以捕获该异常并以适合您自己的方式进行处理情况。您的代码正在将字符串
转换为日期
转换为字符串
再转换为日期
,再转换为字符串
。我不明白原因。另外,您正在使用SimpleDataFormat
类。这是出了名的麻烦和过时很久的。您第二次从解析字符串
到日期
失败,我敢打赌我知道原因:对于第一个SimpleDateFormat
,您记得指定Locale.ENGLISH
,但是您忘记了第二个SimpleDateFormat
。字符串包含英语的Thu
和Nov
,因此如果您的Android Q和R设备有不同的nt语言设置,这就解释了。最后,出于您的目的,这一行:
dato = dato.replaceAll(dato,dt1.format(date2));
与更简单的相同:
dato = dt1.format(date2);
问:java.time不需要Android API级别26吗?
time在较旧和较新的AndroidDE上都能很好地工作