Java 如何让我的程序验证输入的日期并转到下一行代码
所以我对Java相当陌生,我试图让用户输入他们执行燃料事务的日期。我想在允许他们进入下一行之前检查日期是否有效。当我在这里运行代码时,无论我输入什么,它都不会做任何事情,程序也不会结束。想知道有没有人知道我做错了什么,谢谢Java 如何让我的程序验证输入的日期并转到下一行代码,java,arrays,validation,date,netbeans,Java,Arrays,Validation,Date,Netbeans,所以我对Java相当陌生,我试图让用户输入他们执行燃料事务的日期。我想在允许他们进入下一行之前检查日期是否有效。当我在这里运行代码时,无论我输入什么,它都不会做任何事情,程序也不会结束。想知道有没有人知道我做错了什么,谢谢 public static void main (String[] args) throws IOException{ Scanner input = new Scanner (System.in); String[] FuelTransaction = new Stri
public static void main (String[] args) throws IOException{
Scanner input = new Scanner (System.in);
String[] FuelTransaction = new String [100];
Scanner scanner = new Scanner (System.in);
System.out.println("Enter the Date of the Fuel Transaction in dd/mm/yyyy Format: ");
String Date = scanner.nextLine();
if (validDate(Date))
{
System.out.println("The Date of the Fuel Transaction was "+ Date);
}
else
{
JOptionPane.showMessageDialog(null, "Invalid Date");
}
System.out.println("Enter the Number of Litres of Fuel Purchased: ");
String litres = scanner.nextLine();
System.out.println("You Purchased " + litres + " Litres of Fuel");
System.out.println("Enter the Cost per Litre of Fuel: £");
String cost = scanner.nextLine();
System.out.println("The Cost per Litre of Fuel was: £" + cost);
System.out.println ("Records Updated Successfully, Would you like to Log another Fuel Transaction? " +
" If so, Please Enter y");
String newLog = scanner.nextLine();
String filepath = ("TransactionDetails.txt");
newFill(Date,litres,cost,filepath);
}
public static boolean validDate (String Date) {
SimpleDateFormat df = new SimpleDateFormat ("dd/MM/yyyy");
Date validFuel = null;
df.setLenient(false);
try {
validFuel = df.parse(Date);
return true;
}
catch (Exception e)
{
return false;
}
案件事项
新填充(日期、升、成本、文件路径)
Date
是类的名称,而不是对对象的引用。Java代码区分大小写。Java有一些约定:类名的首字母为大写字母,对象引用的首字母为小写字母
因此,将变量命名为date
,而不是date
java.time
您正在使用可怕的日期时间类,这些类在几年前被JSR310中定义的现代java.time类所取代
作语法分析
该类表示一个只包含日期的值,不包含一天中的时间,也不包含或
定义与输入字符串匹配的格式模式
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
解析
String input = "23/01/2019" ; // January 23, 2019
LocalDate ld = LocalDate.parse( input , f ) ;
要对错误输入作出反应,请捕获。用try-catch环绕解析行
try
{
LocalDate ld = LocalDate.parse ( input , f );
} catch ( DateTimeException e )
{
System.out.println ( e );
// … handle faulty input …
// You will likely need a loop. Search Stack Overflow for many many such examples.
}
生成文本
生成标准格式的文本
生成本地化格式的文本
Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter formatterCAfr = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( locale ) ;
String output = ld.format( formatterCAfr ) ;
mercredi公司2019年1月23日
当我运行您的代码时,它会提示我输入日期,当我以所需格式(例如,
12/12/2012
)给出日期时,它会按预期打印“燃料交易日期为12/12/2012”。您能否更明确地说明您为程序提供的输入以及预期输出与实际输出之间的关系?即使setLenient(false)
,该方法也不会完全验证输入,因为javadoc说:该方法可能不会使用给定字符串的整个文本。--您还需要使用来验证日期值之后没有无关的文本。--最好使用较新的Java 8时间API,即LocalDate
和DateTimeFormatter
。是的,很抱歉,我不太清楚,如果我键入例如“s”程序只是提示我输入另一行代码,而不是说日期无效并再次询问日期。@Andreas我该如何实现一个较新的API?Thanks@shan468你可以从经历开始。我也建议您不要使用SimpleDateFormat
和Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。
Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter formatterCAfr = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( locale ) ;
String output = ld.format( formatterCAfr ) ;