当前位置: 首页 > 知识库问答 >
问题:

再次询问用户输入日期是否在将来

丌官玺
2023-03-14

我有问题解决不了。用户被要求输入一个日期,并将其与今天的日期进行比较,如果是在将来,则要求用户再次输入日期。第一次它工作,并告诉用户它是在未来,但当他输入一个有效的日期,它仍然显示重新输入。感谢任何帮助。

    System.out.println("Purchase date DD/MM/YYYY:");
    String date = sc.nextLine();
    SimpleDateFormat dateform = new SimpleDateFormat ("DD/MM/YYYY");
    dateform.parse(date);
    Date d = new Date();
    Date d2 = dateform.parse(date);
    while (d2.compareTo(d) > 0 ){
        
        System.out.println("Re-enter");
        date = sc.nextLine();   
    }
    consumbles.add(date);

共有2个答案

章博耘
2023-03-14

您可以使用一个变量(例如下面代码中的boolean valid)来跟踪输入是否有效。如果输入无效,则需要回环。对于这种情况,我更喜欢使用do-while循环,它保证至少执行一次其主体

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws ParseException {
        Scanner sc = new Scanner(System.in);
        SimpleDateFormat parser = new SimpleDateFormat("d/M/yyyy", Locale.ENGLISH);
        Date today = new Date();
        boolean valid;

        do {
            valid = true;
            System.out.print("Purchase date DD/MM/YYYY: ");
            String strDate = sc.nextLine();
            Date date = parser.parse(strDate);
            if (date.after(today)) {
                System.out.println("The date should not be a future date. Please try again.");
                valid = false;
            }
        } while (!valid);

        System.out.println("Thank you! Processing ...");
    }
}

运行示例:

Purchase date DD/MM/YYYY: 14/3/2021
The date should not be a future date. Please try again.
Purchase date DD/MM/YYYY: 20/4/2021
The date should not be a future date. Please try again.
Purchase date DD/MM/YYYY: 12/3/2021
Thank you! Processing ...

请注意,java.util日期时间API及其格式APISimpleDateFormat已经过时,并且容易出错。建议完全停止使用它们,并切换到现代的日期时间API。

  • 无论出于什么原因,如果您必须坚持使用Java 6或Java 7,您都可以使用ThreeTen-Backport,它将大部分Java.time功能后端到Java 6和7。
  • 如果您正在为一个Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring提供的Java 8+API以及如何在Android项目中使用ThreeTenABP。

使用现代日期时间API:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("d/M/u", Locale.ENGLISH);
        LocalDate today = LocalDate.now();
        boolean valid;

        do {
            valid = true;
            System.out.print("Purchase date DD/MM/YYYY: ");
            String strDate = sc.nextLine();
            LocalDate date = LocalDate.parse(strDate, parser);
            if (date.isAfter(today)) {
                System.out.println("The date should not be a future date. Please try again.");
                valid = false;
            }
        } while (!valid);

        System.out.println("Thank you! Processing ...");
    }
}

从Trail:Date Time中了解有关现代日期时间API的更多信息。

  1. 您错误地使用了d而不是dD用于一年中的某一天。
  2. 您错误地使用了y而不是yy用于一年的一周。
薄兴昌
2023-03-14
    System.out.println("Purchase date DD/MM/YYYY:");
    String date = sc.nextLine();
    // Use java.time, the modern Java date and time API, for your date work.
    // Use single letters in the format pattern string to allow user
    // to enter single digit day and month.
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d/M/u");
    // Use saying variable names (not just d and d2)
    LocalDate today = LocalDate.now(ZoneId.systemDefault());
    LocalDate dateEntered = LocalDate.parse(date, dateFormatter);
    // Using isAfter() for comparison is easier to read then compareTo()
    while (dateEntered.isAfter(today)) {
        System.out.println("Re-enter");
        date = sc.nextLine();
        // Parse the new entered date string into dateEntered
        dateEntered = LocalDate.parse(date, dateFormatter);
    }

    System.out.println("You have successfully entered " + dateEntered);

会话示例:

Purchase date DD/MM/YYYY:
15/3/2021
Re-enter
11/3/2021
You have successfully entered 2021-03-11

您的错误是:

  • 您在格式模式字符串中使用了错误的模式字母大小写。无论使用旧的、麻烦的SimpleDateFormat还是现代的DateTimeFormatter模式,字母都是区分大小写的。大写D表示一年中的某一天,小写D表示月份中的某一天。大写字母y表示周年,仅与周号一起使用。小写y表示纪元年份。在我的代码中,我使用小写u表示带符号的年份,这是DateTimeFormatter
  • 专用的
  • 用户输入新日期时,您没有为D2分配新值。因此,当您的条件D2.compareTo(d)>0为true时,无论用户输入多少次不同的日期,它都将保持为true。
 类似资料:
  • 问题内容: 如果用户到达程序末尾,我希望他们得到一个提示,询问他们是否要重试。如果他们回答是,我想重新运行该程序。 问题答案: 您可以将整个程序放在另一个while循环中,该循环询问用户是否要重试。

  • 我正在为java类的简介做作业,在解释用户需要提供多个输入时遇到了一些困难。问题如下: “要求用户输入一个数字。您应该使用一个输入对话框来进行此输入。请确保将对话框中的字符串转换为实数。程序需要跟踪用户输入的最小数字和输入的最大数字。询问用户是否要输入另一个数字。如果是,请重复此过程。如果不是,请输出用户输入。 当用户想要退出时,该程序在程序的末尾输出最大和最小的数字。 此外,您的程序应该考虑用户

  • 我创建了以下类,用于输入用户的年龄,然后在控制台中显示适当的信息。 运行此程序时,控制台会询问“请输入您的年龄:”

  • 我试图将用户输入转换为datetime值,但它在shell脚本中给出了无效的日期错误 $5用户正在输入2015年12月3日$6用户正在输入00:10:00

  • 我一辈子都找不到在datetime local的输入框中添加秒的位置 现在它要求,我想在部分添加。结果将是: 我正在用PHP/HTML5编码 任何指示都将不胜感激。

  • 我创建了一个jquery DatePicker。我希望用户选择大于或等于当前日期的日期,所以我使用了。这将禁用所有以前的日期。 但是,通过输入字段,用户可以键入上一个日期。如何禁用输入字段而不禁用DatePicker?