Android 中的日期验证

新手上路,请多包涵

我是 Android 编程的新手,目前正在开发一个应用程序。有人可以帮助我验证用户输入的日期是否有效吗?

 private Pattern pattern;
private Matcher matcher;

private static final String DATE_PATTERN =
       "(0?[1-9]|1[012]) [/.-] (0?[1-9]|[12][0-9]|3[01]) [/.-] ((19|20)\\d\\d)";

/**
* Validate date format with regular expression
* @param date date address for validation
* @return true valid date format, false invalid date format
*/
public boolean validate(final String date){

  matcher = pattern.matcher(date);

  if(matcher.matches()){
      matcher.reset();

      if(matcher.find()){
          String day = matcher.group(1);
          String month = matcher.group(2);
          int year = Integer.parseInt(matcher.group(3));

          if (day.equals("31") &&
           (month.equals("4") || month .equals("6") || month.equals("9") ||
                   month.equals("11") || month.equals("04") || month .equals("06") ||
                   month.equals("09"))) {
             return false; // only 1,3,5,7,8,10,12 has 31 days
          }
      }

      else{
           return false;
      }
  }
  else{
      return false;
  }
}

原文由 androidBoomer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 340
2 个回答
private Pattern pattern;
private Matcher matcher;

private static final String DATE_PATTERN =
       "(0?[1-9]|1[012]) [/.-] (0?[1-9]|[12][0-9]|3[01]) [/.-] ((19|20)\\d\\d)";

  /**
   * Validate date format with regular expression
   * @param date date address for validation
   * @return true valid date format, false invalid date format
   */
public boolean validate(final String date){

  matcher = pattern.matcher(date);

  if(matcher.matches()){
      matcher.reset();

      if(matcher.find()){
          String day = matcher.group(1);
          String month = matcher.group(2);
          int year = Integer.parseInt(matcher.group(3));

          if (day.equals("31") &&
            (month.equals("4") || month .equals("6") || month.equals("9") ||
                   month.equals("11") || month.equals("04") || month .equals("06") ||
                   month.equals("09"))) {
             return false; // only 1,3,5,7,8,10,12 has 31 days
          }

          else if (month.equals("2") || month.equals("02")) {
               //leap year
               if(year % 4==0){
                   if(day.equals("30") || day.equals("31")){
                       return false;
                   }
                   else{
                       return true;
                   }
              }
              else{
                  if(day.equals("29")||day.equals("30")||day.equals("31")){
                      return false;
                  }
                  else{
                      return true;
                  }
              }
          }

          else{
              return true;
          }
      }

      else{
           return false;
      }
  }
  else{
      return false;
  }
}

并将这些代码放在您的 onClick() 上:

 matcher = Pattern.compile(DATE_PATTERN).matcher(Birthday);

//Birthday validator
    else if (!matcher.matches()) {
    Toast.makeText(getApplicationContext(), "Invalid Birthday!", Toast.LENGTH_SHORt).show();
}

原文由 user2400937 发布,翻译遵循 CC BY-SA 3.0 许可协议

DatePicker 输入生日很痛苦。这是我的解决方案:

工具

public static final SimpleDateFormat BIRTHDAY_FORMAT_PARSER = new SimpleDateFormat("yyyy-MM-dd");
public static final String DASH_STRING = "-";
public static Calendar parseDateString(String date) {
        Calendar calendar = Calendar.getInstance();
        BIRTHDAY_FORMAT_PARSER.setLenient(false);
        try {
            calendar.setTime(BIRTHDAY_FORMAT_PARSER.parse(date));
        } catch (ParseException e) {}
        return calendar;
    }
public static boolean isValidBirthday(String birthday) {
        Calendar calendar = parseDateString(birthday);
        int year = calendar.get(Calendar.YEAR);
        int thisYear = Calendar.getInstance().get(Calendar.YEAR);
        return year >= 1900 && year < thisYear;
    }

主要活动

private void setupBirthdayEditText() {
        mBirthdayEditText.addTextChangedListener(new TextWatcher() {
            int beforeTextChangedLength;
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                beforeTextChangedLength = charSequence.length();
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if (!TextUtils.isEmpty(mBirthdayTextInputLayout.getError())) {
                    mBirthdayTextInputLayout.setError(null);
                    mBirthdayTextInputLayout.setErrorEnabled(false);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {
                int length = editable.length();
                // text is being removed
                if (beforeTextChangedLength > length) return;

                String str = editable.toString();
                String[] strArr = str.split(Utils.DASH_STRING);
                // only add dash after input year with zero dash and input month with one dash
                if ((length == YEAR_LENGTH && strArr.length == 1) || (length == YEAR_MONTH_LENGTH && strArr.length == 2)) {
                    mBirthdayEditText.setText(str + Utils.DASH_STRING);
                    mBirthdayEditText.setSelection(mBirthdayEditText.length());
                }
            }
        });
    }

protected boolean isAllFieldsValid() {
        String birthday = mBirthdayEditText.getText().toString().trim();
        if (!Utils.isValidBirthday(birthday)) {
            mBirthdayTextInputLayout.setError(getString(R.string.error_birth_date));
            return false;
        }

    return true;
}

activity_main.xml

 <android.support.design.widget.TextInputLayout
                android:id="@+id/register_birthday_textinput_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:errorTextAppearance="@style/ErrorTextInputLayout"
                >

                <android.support.design.widget.TextInputEditText
                    android:id="@+id/register_birthday_edittext"
                    android:hint="@string/birth_date"
                    android:backgroundTint="@color/white_12"
                    android:inputType="date"
                    style="@style/BaseEditText"
                    android:digits="1234567890"
                    android:maxLength="10"
                    />

            </android.support.design.widget.TextInputLayout>

这并不完美,因为我们不应该使用 try catch 检查验证,并且用户必须在输入期间查看日期格式,但如果您想避免默认日期选择器,它会简单方便。

原文由 thanhbinh84 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏