Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Studio-使用Android 10的Physycal设备上出现不可解析的日期错误_Android_Android Studio_Date_Simpledateformat_Android 10.0 - Fatal编程技术网

Java Android Studio-使用Android 10的Physycal设备上出现不可解析的日期错误

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

这部分代码将输入从“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”

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
  • ,解释得非常透彻
  • 类似问题:
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吗? time在较旧和较新的AndroidDE上都能很好地工作