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

Android DateFormat.parse(String) is parsing wrong dates

我正在开发我的 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");

但这也无济于事。有谁知道为什么它会解析错误的日期?

使用 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

考虑使用 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 年前 - 但是您可以更改它。