compareTo 不能应用于 java.util.Date (Java)



我正在用Java编写一个约会程序,遇到了一个错误,如下所示:

AppointmentNew.java:68: unreported exception java.text.ParseException; must be caught or declared to be thrown
        Date lowDate = sdf.parse(stdin.nextLine());
                                ^
AppointmentNew.java:70: unreported exception java.text.ParseException; must be caught or declared to be thrown
        Date highDate = sdf.parse(stdin.nextLine());  
                                 ^
AppointmentNew.java:77: unreported exception java.text.ParseException; must be caught or declared to be thrown
           Date newCurrentDate = sdf.parse(currentDate); 

该程序假设允许用户进行新的约会,当他们这样做时,他们就可以输入日期和描述(他们可以根据需要多次执行此操作(,之后他们可以选择要打印的程序的日期范围(假设在他们提供的日期范围内打印出约会"。这是我错误发生的地方...

这是我的代码:

import java.util.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class AppointmentNew 
{
public static void main (String[] args)
{
  ArrayList<String> list = new ArrayList<String>();
  Scanner stdin = new Scanner(System.in);
  String choice = "";
  int choiceNum = 0;
  String date = "";
  String descrip = "";
  int type = 0;
  String typeChose = "";
  System.out.println("Welcome to Appointment App!n");
  System.out.println("t============================");
  do
  {
     System.out.print("ntMake Choice (1: New, 2: Print Range, 3: Print All, 4: Quit) ");
     choice = stdin.nextLine();
     choiceNum = Integer.parseInt(choice);
     if (choiceNum == 1)
     {
        System.out.print("nntEnter New Appointment Date in mm/dd/yyyy format: ");
        date = stdin.nextLine();
        System.out.print("nntEnter New Appointment Description: ");
        descrip = stdin.nextLine();
        System.out.print("nntEnter Type (1 = Once, 2 = Daily, 3 = Monthly): ");
        type = stdin.nextInt();
        stdin.nextLine();
        if (type == 1)
        {
           Once once = new Once(date, descrip);
           typeChose = "One-Time";
        }
        else if (type == 2)
        {
           Daily daily = new Daily(date, descrip);
           typeChose = "Daily";
        }
        else
        {
           Monthly monthly = new Monthly(date, descrip);
           typeChose = "Monthly";
        }
        String stringToAdd = "";
        stringToAdd = (date + " : "" + descrip + "", " + typeChose);
        list.add(stringToAdd);
        System.out.println("nntNew " + typeChose + " Appointment Added for " + date + "n");
        System.out.println("t============================n");

     }
     if (choiceNum == 2)
     {
        System.out.print("nntEnter START Date in mm/dd/yyyy format: ");
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
        Date lowDate = sdf.parse(stdin.nextLine());
        System.out.print("nntEnter END Date in mm/dd/yyyy format: ");
        Date highDate = sdf.parse(stdin.nextLine());  
        for(int i = 0; i < list.size(); i++)
        {
           int dateSpot = list.get(i).indexOf(" ");
           String currentDate = list.get(i);
           currentDate.substring(0, dateSpot);
           Date newCurrentDate = sdf.parse(currentDate); 
           if (newCurrentDate.compareTo(lowDate) >= 0 && newCurrentDate.compareTo(highDate) <= 0)
           {
              System.out.println("nt" + list.get(i));   
           }
        }
     }
     if (choiceNum == 3)
     {
        for(int i = 0; i < list.size(); i++)
        {
           System.out.println("nt" + list.get(i));     
        }
     }
  }while (choiceNum != 4);      
 }
}

问题是您正在尝试将字符串与日期进行比较。这甚至意味着什么?

您应该将String转换为Date(例如,使用 SimpleDateFormat ( - 或者理想情况下,使用 Joda Time - 然后在将它们作为相同类型时比较这些值。

编辑:如评论中所述,这也不是您想要的:

SimpleDateFormat sdf = new SimpleDateFormat("mm/dd/yyyy");

mm意味着SimpleDateFormat分钟,而不是几个月。你想要MM/dd/yyyy。有关更多详细信息,请参阅SimpleDateFormat文档。

currentDate.compareTo(lowDate)

currentDateStringlowDateDate。你正在尝试compareTo两件不同的事情。

currentDate转换为日期对象,然后调用compareTo();

将 Date 类型的对象与字符串进行比较是正常的。使用SimpleDateFormat(或其他格式(将字符串转换为日期,您将能够比较这两个对象。

Date correctCurrentDate = sdf.parse(currentDate);

为了避免在测试程序中添加try/catch,我通常编写了如下主方法:

public static void main (String[] args) throws Exception

当然,对于在生产环境中运行的程序,您应该在可以处理异常的地方使用 try/catch。但是对于测试程序来说,这很烦人。

最新更新