Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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
Android Java SimpleDataFormat异常不正确_Java_Android_Date - Fatal编程技术网

Android Java SimpleDataFormat异常不正确

Android Java SimpleDataFormat异常不正确,java,android,date,Java,Android,Date,例如,我试图确保用户输入了正确的日期格式10/08/2015 try{ SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); d = sdf.parse(date.getText().toString()); }catch(ParseException ex){ Toast.makeText(MainActivity.this,

例如,我试图确保用户输入了正确的日期格式10/08/2015

try{
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
             d = sdf.parse(date.getText().toString());
        }catch(ParseException ex){
            Toast.makeText(MainActivity.this,
                    "Date format is wrong.", Toast.LENGTH_LONG).show();
            return;
        }
但它仍然解析大多数错误输入,如111/10/2013或11/109/2013或一些包含字符的输入

另一个问题是如何将dd/mm/yyyy类型的日期转换为NameofMonth day,year字符串

因此,2018年4月1日将转换为2018年4月12日

    DateTimeFormatter enteredFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
    DateTimeFormatter usDateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.MEDIUM)
            .withLocale(Locale.US);
    LocalDate d;
    try {
        d = LocalDate.parse(date.getText(), enteredFormatter);
        System.out.println(d.format(usDateFormatter));
    } catch (DateTimeParseException dtpe) {
        Toast.makeText(MainActivity.this,
                "Date format is wrong.", Toast.LENGTH_LONG).show();
        return;
    }
从您的问题中获取不正确的日期此代码将捕获
java.time.format.DateTimeParseException:Text“111/10/2013”无法在索引2中解析
java.time.format.DateTimeParseException:Text“11/109/2013”无法在索引5中解析
,因此向用户提供错误消息。给定一个正确的日期字符串,如
11/10/2013
,它的打印方式如下:

2013年10月11日

我还没有在Android上测试的一个细节:据我所知,
EditText.getText
将返回一个
Editable
,它实现了
CharSequence
。由于
LocalDate.parse
接受
CharSequence
,因此可以传递
date.getText()
,而不需要
.toString()

< >当为观众设置日期时,首先要考虑的是使用java内置的格式化程序来为该听众的区域设置。您所要求的格式与美国地区的
MEDIUM
格式一致。我认为这不是巧合。所以一定要好好利用

同时,我利用了
java.time
,现代java日期和时间API
SimpleDataFormat
是出了名的麻烦和过时。我避开它。现代的API非常好用

问题:我可以在Android上使用java.time吗? 是的,
java.time
在较旧和较新的Android设备上运行良好。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(我听说是API级别26),现代API是内置的
  • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
  • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

日期是什么类型的?我相信变量d是日期类型的。因此,您可以检查这个d是一个日期d,Date是editText要打印出来,您需要使用您想要的输出格式制作第二个SimpleDateFormat,并调用sdf2.format(d)FYI,像
java.util.Date
java.util.Calendar
java.text.SimpleDateFormat
这样麻烦的旧日期时间类现在是遗留的,被班级取代了。大部分java.time功能都在项目中向后移植到Java6和Java7。进一步适应项目中早期的Android。看见