【问题标题】:How do I split an EditText date into year, month and day integers for a Calendar object?如何将 EditText 日期拆分为 Calendar 对象的年、月和日整数?
【发布时间】:2015-09-28 01:14:49
【问题描述】:

我有一个用户从 UI 上的 EditText 行上的 DatePicker 输入日期。我想将日期拆分为年、月和日,这样我就可以将这 3 个元素打包传递。我收到了这个致命的异常消息'“NumberFormatException:Invalid int:“2015”'。所以看起来它不喜欢年份拆分。也许在 2015 年之后有一个空格导致错误。什么是我错过了这里?

部分活动文件:

...
private ListenerEditText fListenerEditText;
private int year;
private int month;
private int day;

Calendar c = Calendar.getInstance();
String dateStr = fListenerEditText.getText().toString();
String[]dateParts = dateStr.split("/");
year = Integer.parseInt(dateParts[2]);
month = Integer.parseInt(dateParts[0]);
day = Integer.parseInt(dateParts[1]);
c.set(year, month, day);
Bundle argsbundle = new Bundle();
argsbundle.putInt("year", c.get(Calendar.YEAR));
...

【问题讨论】:

    标签: android string datepicker


    【解决方案1】:

    这是因为“2015”末尾有一个尾随空格。

    以下将导致您看到的相同崩溃:

        Integer.parseInt("2015 ");
    

    我会做一个这样的方法:

    public int safeParseInt(String number) throws Exception {
        if(number != null) {
            return Integer.parseInt(number.trim());
        } else {
            throw new NullPointerException("Date string is invalid"); 
        }
    }
    

    那么你可以这样做:

    try {
        year = safeParseInt(dateParts[2]);
        month = safeParseInt(dateParts[0]);
        day = safeParseInt(dateParts[1]);
    } catch (Exception e) {
        // SHOW SOME MESSAGE TO THE USER
    }
    

    【讨论】:

    • 优秀。我在代码中的 EditText 中添加了一个空格,以便我正在检索。 .trim() 应该可以工作。我还使用 '.replace(" ","")' 删除空格。使用 .trim 而不是 .replace 有什么优势吗?
    • Trim 只从末尾获取,而 replace 将删除所有空格字符。在这种情况下,这可能没什么大不了的,但它们在功能上并不相同。
    【解决方案2】:

    这种方法会更好。

    SimpleDateFormat sdf  =   new SimpleDateFormat("yyyy-MM-dd");
        try{
            Date date=sdf.parse("2015-09-28");
            Calendar calendar=Calendar.getInstance();
            calendar.setTime(date);
            System.out.println("year="+calendar.get(Calendar.YEAR)+"  month="+(calendar.get(Calendar.MONTH)+1)+"  day="+calendar.get(Calendar.DAY_OF_MONTH));
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    

    【讨论】:

    • 不错。我看到 SimpleDateFormat 使用了很多次。位我也读过它不是线程安全的。那么使用 SimpleDateFormat 有什么问题吗?
    【解决方案3】:

    我已经测试过了,它可以工作,所以你的拆分代码是正确的。

    String dateStr = "01/01/2015";
    String[]dateParts = dateStr.split("/");
    year = Integer.parseInt(dateParts[2]); //=> 2015
    month = Integer.parseInt(dateParts[0]); //=> 01
    day = Integer.parseInt(dateParts[1]); //=> 01
    

    因此,我认为问题在于您的输入数据 (user entered date from a DatePicker) = dateStr
    您应该检查用户在使用this获取数据之前输入的格式日期
    如果你知道你的数据总是包含空间,你应该通过trim()方法删除它

    记得在

    c.set(year, month, day);
    

    月份的01是二月,所以你应该把它改成

    c.set(year, month-1, day);
    

    希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多