Android DateFormat.parse(String)正在解析错误的日期

时间:2015-03-08 02:27:08

标签: android string parsing date simpledateformat

我正在使用我的Android应用,但遗憾的是我遇到了一个问题,而这个问题并未涉及到任何地方。解析错误的日期,如标题中所述,我的代码示例在这里:

EditText date_field = (EditText) findViewById(R.id.date);
String date = date_field.getText().toString();
DateFormat date_format = SimpleDateFormat.getDateInstance(DateFormat.SHORT);
try
{
    date_format.parse(date);
}
catch (ParseException e)
{
    Toast.makeText(this, "Please specify the date", Toast.LENGTH_SHORT).show();
    return;
}

问题是它没有捕获“0.0.0”或“03.06.05”等输入的异常。我试过用这样的手工制作的DateFormat:

DateFormat date_format = new SimpleDateFormat("dd.MM.yyyy");

但它也没有帮助。有谁知道为什么解析错误的日期?

2 个答案:

答案 0 :(得分:1)

使用DatePicker而不是EditText进行日期输入。

XML:

<DatePicker
    android:id="@+id/datePicker"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

Android文档:http://developer.android.com/reference/android/widget/DatePicker.html

答案 1 :(得分:1)

考虑使用DatePickerDialog。避免错误日期输入的一些有用方法: getDatePicker()。setMinDate(millis) getDatePicker()。setMaxDate(millis)

示例:

<强> UI

    birthday = (EditText) rootView.findViewById(R.id.birthday);
    birthday.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int code = event.getAction() & MotionEvent.ACTION_MASK;
            switch (code) {
                case MotionEvent.ACTION_DOWN:
                    DatePickerDialogFragment datePickerDialogFragment = new DatePickerDialogFragment();
                    datePickerDialogFragment.setListener(new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                            Calendar calendar = Calendar.getInstance();
                            calendar.set(year, monthOfYear, dayOfMonth);
                            birthday.setText(android.text.format.DateFormat.format("yyyy-MM-dd", calendar));
                        }
                    });
                    datePickerDialogFragment.show(getFragmentManager(), DatePickerDialogFragment.TAG);
            }
            return true;
        }
    });

<强> DatePickerDialogFragment

public class DatePickerDialogFragment extends DialogFragment {
    public static final String TAG = LogUtils.makeLogTag(DatePickerDialogFragment.class);

    private DatePickerDialog.OnDateSetListener listener;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(),
                listener,
                Calendar.getInstance().get(Calendar.YEAR),
                Calendar.getInstance().get(Calendar.MONTH),
                Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
        Calendar today = Calendar.getInstance();
        today.add(Calendar.YEAR, -4);
        today.add(Calendar.DAY_OF_YEAR, -1);
        datePickerDialog.getDatePicker().setMaxDate(today.getTimeInMillis());
        return datePickerDialog;
    }

    public void setListener(DatePickerDialog.OnDateSetListener listener) {
        this.listener = listener;
    }
}

在此示例中, DatePickerDialog 被包装到DialogFragment,因此它可以在配置更改(例如屏幕旋转等)时继续存在。最小日期也设置为不少于4年 - 但您可以更改它。