【问题标题】:Check if a birth date is valid out of 3 integers (mm/dd/yyyy)检查出生日期是否在 3 个整数中有效 (mm/dd/yyyy)
【发布时间】:2016-04-15 14:22:10
【问题描述】:

我制作了一个扫描仪,它要求输入 3 个整数:月/日/出生年 对于每个整数,我检查这是否是一个有效的条目(即月 0)。 如果三个主菜是有效的,我会做一个:

System.out.println(month + "-" + day + "-" + year);

完整代码如下:

// TODO code application logic here
    Scanner sc = new Scanner(System.in);
    int intJour;
    int intMois;
    int intAnnee;

    do {
        System.out.println("Year of birth :");
        intJour = sc.nextInt();
        sc.nextLine();
    } while (intJour < 0 || intJour > 31);

    do {
        System.out.println("Month of birth :");
        intMois = sc.nextInt();
        sc.nextLine();
    } while (intMois < 0 || intMois > 12);

    do {
        System.out.println("Year of birth :");
        intAnnee = sc.nextInt();
        sc.nextLine();
    } while (intAnnee < 0 || intAnnee > Calendar.getInstance().get(Calendar.YEAR));

    System.out.println("Birth date: " + intJour + "-" + intMois + "-" + intAnnee);

我想从用户输入中确定一个日期,并检查该日期是否存在。 I.E 并不是每个月都有 31 个关于所涉及的年份。

【问题讨论】:

  • 使用if(condition) 子句来放置所有条件。此外,这看起来像是一个家庭作业问题。
  • 条件有效。例如,用户不能输入 13/32/2017。但有时满足条件:2015 年 2 月 31 日但日期不存在,因为它是 bisextile(它的一个例子)。
  • if 条件不成立时,使用else 采取行动。
  • 我需要参考日历,这就是我努力做的事情。我的问题可能不够准确。
  • 我编辑了因为我认为我的问题不清楚。不是每个条件的验证都是一个问题。我想从用户输入中确定一个日期,并检查该日期是否存在。 I.E 并非每个月都有 31 项涉及的年份。

标签: java date format


【解决方案1】:

使用语句来检查某个日期是否有效可能会非常令人困惑。因此,您应该使用标准化的方法。

如果你使用的是 Java 8,那么你可以直接使用这个:

public static boolean isDateValid(int year, int month, int day) {
    boolean dateIsValid = true;
    try {
        LocalDate.of(year, month, day);
    } catch (DateTimeException e) {
        dateIsValid = false;
    }
    return dateIsValid;
}

只需将 intAnnee 输入到年,将 intMois 输入到月,将 intJour 输入到日。

如果您使用的是早期版本的 Java,请尝试以下操作:

final static String DATE_FORMAT = "dd-MM-yyyy";

public static boolean isDateValid(String date) 
{
        try {
            DateFormat df = new SimpleDateFormat(DATE_FORMAT);
            df.setLenient(false);
            df.parse(date);
            return true;
        } catch (ParseException e) {
            return false;
        }
}

【讨论】:

  • 这篇文章是关于分别取日期、月份和年份并进行验证的。
  • 我认为您可能是对的,我关注的是“我如何检查日期是否有效”部分。也许他的问题没说对?
  • 不,你说得对,我想检查日期是否存在。例如,用户无法在 bisextile 年份输入 Fabruary 的 31。
  • 唯一需要改变这个答案是正确的就是参数:它应该接受 3 个整数(日、月、年),然后它们应该连接成一个字符串。之后,解析将完成剩下的工作。
  • @Igorovics 没错。如果有人想使用SimpleDateFormat 解析,那么为什么要使用三个ints。我猜他需要接受三个输入并使用if-else 条件进行验证。
【解决方案2】:

如果你想这样做,你必须颠倒你的问题的顺序:问第一年,第二个月,最后一天。通过这种方式,您将能够在用户输入之前知道是否满足所有可能的条件(即:闰年的 2 月 29 日或 31 天的月份)。

此外,要最后检查日期是否正确,请使用SimpleDateFormat

final static String DATE_FORMAT = "dd-MM-yyyy";

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int intJour;
    int intMois;
    int intAnnee;

    do {
        System.out.println("Veuillez entrer votre année de naissance :");
        intAnnee = sc.nextInt();
        sc.nextLine();
    } while (intAnnee < 0 || intAnnee > Calendar.getInstance().get(Calendar.YEAR));

    do {
        System.out.println("Veuillez entrer votre mois de naissance (de 01 à 12) :");
        intMois = sc.nextInt();
        sc.nextLine();
    } while (intMois < 0 || intMois > 12);

    do {
        System.out.println("Veuillez entrer votre jour de naissance (de 01 à 31) :");
        intJour = sc.nextInt();
        sc.nextLine();
    } while (!isDateValid(intAnnee, intMois, intJour));

    System.out.println("Confirmation de votre année de naissance: " + intJour + "-" + intMois + "-" + intAnnee);
    sc.close();
}

public static boolean isDateValid(int year, int month, int day) 
{
        try {
            DateFormat df = new SimpleDateFormat(DATE_FORMAT);
            df.setLenient(false);
            df.parse(day + "-" + month + "-" + year);
            return true;
        } catch (ParseException e) {
            return false;
        }
}

输出:

Veuillez entrer votre année de naissance :
2012
Veuillez entrer votre mois de naissance (de 01 à 12) :
30
Veuillez entrer votre mois de naissance (de 01 à 12) :
02
Veuillez entrer votre jour de naissance (de 01 à 31) :
30
Veuillez entrer votre jour de naissance (de 01 à 31) :
30
Veuillez entrer votre jour de naissance (de 01 à 31) :
30
Veuillez entrer votre jour de naissance (de 01 à 31) :
10
Confirmation de votre année de naissance: 10-2-2012

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多