Android 日历日期验证不是';t返回正确的布尔值

Android 日历日期验证不是';t返回正确的布尔值,android,date,validation,calendar,java-calendar,Android,Date,Validation,Calendar,Java Calendar,我试图验证日历日期,但是当它被验证时,无论输入如何,代码都返回false String strDateOfBirth = userInputArrayList.get(7) + "/" + userInputArrayList.get(8) + "/" + userInputArrayList.get(9); Log.d(TAG, "1Date of Birth: " + strDateOfBirth); SimpleDateFormat sdf = new SimpleDateFormat("

我试图验证日历日期,但是当它被验证时,无论输入如何,代码都返回false

String strDateOfBirth = userInputArrayList.get(7) + "/" + userInputArrayList.get(8) + "/" + userInputArrayList.get(9);
Log.d(TAG, "1Date of Birth: " + strDateOfBirth);
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date dtDateOfBirth = parseDate(strDateOfBirth, sdf);

//Convert to epoch millis
long dobmillis = dtDateOfBirth.getTime();
Log.d(TAG, "date of birth in milli: " + dobmillis);

//Current time in epoch millis
long currmillis = Calendar.getInstance().getTimeInMillis();
Log.d(TAG, "current date in milli: " + currmillis);

Log.d(TAG, "less than: " + (19L * 365L * 24L * 60L * 60L * 1000L));
Log.d(TAG, "less than: " + (11L * 365L * 24L * 60L * 60L * 1000L));

if ((currmillis - dobmillis) > (19L * 365L * 24L * 60L * 60L * 1000L)) {
    //More than 19 years
    txtCalenderErrorCreateAccountPage.setText("must be 19 years of age");
    nextPage = false;
} else if ((currmillis - dobmillis) < (11L * 365L * 24L * 60L * 60L * 1000L)) {
    //less than 11 years
    txtCalenderErrorCreateAccountPage.setText("must be 11 years of age");
    nextPage = false;
} else {             
    txtCalenderErrorCreateAccountPage.setText("correct");
}


public Date parseDate(String date, SimpleDateFormat sdf) {
    try {
        Date d = sdf.parse(date);
        return d;
    } catch (ParseException e) {
        showToast("There has been an error");
        return null;
    }
}
String strDateOfBirth=userInputArrayList.get(7)+“/”+userInputArrayList.get(8)+“/”+userInputArrayList.get(9);
日志d(标签“1出生日期:+1出生日期”);
SimpleDataFormat sdf=新的SimpleDataFormat(“日/月/年”);
Date dtDateOfBirth=parseDate(strDateOfBirth,sdf);
//换算成历元毫
long dobmillis=dtDateOfBirth.getTime();
Log.d(标签“出生日期,单位为毫:“+dobmillis”);
//当前时间(以毫秒为单位)
long currmillis=Calendar.getInstance().getTimeInMillis();
Log.d(标签,“当前日期单位为毫:“+currmillis”);
Log.d(标签,“小于:”+(19L*365L*24L*60L*60L*1000L));
Log.d(标签,“小于:”+(11L*365L*24L*60L*60L*1000L));
如果((currmillis-dobmillis)>(19L*365L*24L*60L*60L*1000L)){
//超过19年
txtCalenderErrorCreateCountPage.setText(“必须是19岁”);
下一页=假;
}否则如果((currmillis-dobmillis)<(11L*365L*24L*60L*60L*1000L)){
//不到11年
txtCalenderErrorCreateCountPage.setText(“必须是11岁”);
下一页=假;
}否则{
txtCalenderErrorCreateCountPage.setText(“正确”);
}
公共日期解析日期(字符串日期,SimpleDataFormat sdf){
试一试{
日期d=sdf.parse(日期);
返回d;
}捕获(解析异常){
showToast(“出现错误”);
返回null;
}
}
我希望当出生日期意味着用户将在11到19岁之间时,该日期返回true

任何帮助都将不胜感激

String strDateOfBirth=userInputArrayList.get(7)+“/”+userInputArrayList.get(8)+“/”+userInputArrayList.get(9);
String strDateOfBirth = userInputArrayList.get(7) + "/" + userInputArrayList.get(8) + "/" + userInputArrayList.get(9);
Log.d(TAG, "1Date of Birth: " + strDateOfBirth);
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date dtDateOfBirth = parseDate(strDateOfBirth, sdf);

//Convert to epoch millis
long dobmillis = dtDateOfBirth.getTime();
Log.d(TAG, "date of birth in milli: " + dobmillis);

//Current time in epoch millis
long currmillis = Calendar.getInstance().getTimeInMillis();
Log.d(TAG, "current date in milli: " + currmillis);

Log.d(TAG, "less than: " + (19L * 365L * 24L * 60L * 60L * 1000L));
Log.d(TAG, "less than: " + (11L * 365L * 24L * 60L * 60L * 1000L));

if ((currmillis - dobmillis) > (19L * 365L * 24L * 60L * 60L * 1000L)) {
  //More than 19 years
  txtCalenderErrorCreateAccountPage.setText("more than 19 years of age");
} else if ((currmillis - dobmillis) < (11L * 365L * 24L * 60L * 60L * 1000L)) {
  //less than 11 years
  txtCalenderErrorCreateAccountPage.setText("less than 11 years of age");
  nextPage = false;
} else {             
  txtCalenderErrorCreateAccountPage.setText("11 - 19");
  nextPage = false;
}


  public Date parseDate(String date, SimpleDateFormat sdf) {
    try {
      Date d = sdf.parse(date);
      return d;
    } catch (ParseException e) {
      showToast("There has been an error");
      return null;
  }
}
日志d(标签“1出生日期:+1出生日期”); SimpleDataFormat sdf=新的SimpleDataFormat(“日/月/年”); Date dtDateOfBirth=parseDate(strDateOfBirth,sdf); //换算成历元毫 long dobmillis=dtDateOfBirth.getTime(); Log.d(标签“出生日期,单位为毫:“+dobmillis”); //当前时间(以毫秒为单位) long currmillis=Calendar.getInstance().getTimeInMillis(); Log.d(标签,“当前日期单位为毫:“+currmillis”); Log.d(标签,“小于:”+(19L*365L*24L*60L*60L*1000L)); Log.d(标签,“小于:”+(11L*365L*24L*60L*60L*1000L)); 如果((currmillis-dobmillis)>(19L*365L*24L*60L*60L*1000L)){ //超过19年 txtCalenderErrorCreateCountPage.setText(“超过19岁”); }否则如果((currmillis-dobmillis)<(11L*365L*24L*60L*60L*1000L)){ //不到11年 txtCalenderErrorCreateCountPage.setText(“小于11岁”); 下一页=假; }否则{ txtCalenderErrorCreateCountPage.setText(“11-19”); 下一页=假; } 公共日期解析日期(字符串日期,SimpleDataFormat sdf){ 试一试{ 日期d=sdf.parse(日期); 返回d; }捕获(解析异常){ showToast(“出现错误”); 返回null; } }
通过将所有内容转换为epoch,基本上降低了代码复杂性,并消除了所有时区依赖关系 您使用了
mm
(以小时为单位的分钟)而不是
mm
(以年为单位的月份)

使用正确的符号将解决问题。但是,
java.util
Date-Time API及其格式化API
SimpleDataFormat
已经过时,并且容易出错。建议完全停止使用,并切换到*

使用
java.time
的解决方案,现代API: 了解更多关于
java.time
、来自的*


*无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

谢谢!检查11岁以下的用户是否相同,但11岁而不是19岁,小于号而不是大于号?相同的代码。。。。当我输入一个年龄小于11岁(特别是2008年1月12日)的日期时,它会将其视为年龄介于11岁和19岁之间,有什么建议吗?再次发布你的代码,伙计,idk你做了什么现在我的代码将给你不到11岁,11到19岁,超过1919年假设你正在为ANDORD编程,考虑扔掉长期过时和臭名昭著的麻烦代码< SimpleDateFormat <代码>和朋友,然后添加到Android项目中,以便使用<代码> java.时间>代码>,java java日期和时间API。和他一起工作真是太好了,我无法复制。我试过
28/07/2008
28/08/2000
,两次都得到了
正确的DOB
。你能用例子输入吗?
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("d/M/u", Locale.ENGLISH);
        
        // Test
        Stream.of(
                28 + "/" + 5 + "/" + 2000,
                28 + "/" + 5 + "/" + 2008,
                28 + "/" + 5 + "/" + 2012
        ).forEach(strDateOfBirth -> {
            LocalDate dtDateOfBirth = LocalDate.parse(strDateOfBirth, dtf);
            LocalDate today = LocalDate.now();
            long years = ChronoUnit.YEARS.between(dtDateOfBirth, today);
            System.out.println( 
                                years > 19 ? "must be 19 years of age" :
                                years < 11 ? "must be 11 years of age" :
                                             "correct"
            );
        });     
    }
}
must be 19 years of age
correct
must be 11 years of age