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 年前 - 但是您可以更改它。
我正在开发我的 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 年前 - 但是您可以更改它。