当前位置: 代码迷 >> java >> 将字符串转换为日期并在ArrayList Java中进行比较
  详细解决方案

将字符串转换为日期并在ArrayList Java中进行比较

热度:92   发布时间:2023-07-25 19:13:29.0

我对编程和Java完全陌生,因此请原谅任何愚蠢的错误和非常糟糕的代码(我不知道如何定购/格式化)。 我已经完成了一项视频清单的任务,该清单具有三个功能:清单,租金和支票。 我有一个ArrayList,其中包含可用视频的当前清单。 在检查功能下,我希望能够将returndate字符串转换为Date,然后将其与今天的日期进行比较。 如果返回日期和今天的日期相等,我想返回一条消息:“视频应在今天到期”,如果返回日期已经过去(早于今天的日期),我要返回一条消息,指出“视频过期”。

我一直在研究如何将字符串转换为日期,反之亦然,并且一直在整日尝试使用它,还有更多尝试使它工作,但是我似乎无法使其工作。 我知道有很多类似的问题已经提出并得到了回答,但是我已经尝试遵循它们,但是它没有用。 任何帮助将非常感激。 如我之前所说,我是一个新手,所以请原谅任何愚蠢行为。

整个程序代码:

import java.text.DateFormat;
import java.text.ParseException;
import java.time.LocalDate;
import java.util.*;

class InventoryRow {
private String name;
private String type;
private Character availability;
private String returndate;

public InventoryRow(String name, String type, Character availability, String returndate) {
    this.name = name;
    this.type = type;
    this.availability = availability;
    this.returndate = returndate;
}

public String getReturndate() {
    return returndate;
}

public void setReturndate(String returndate) {
    this.returndate = returndate;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public Character getAvailability() {
    return availability;
}

public void setAvailability(Character availability) {
    this.availability = availability;
}

public String toString() {
    return name + "   " + type + "   " + availability + "   " + returndate;
}
}

public class InventorySort {

public static void main(String[] args) throws ParseException {
    List<InventoryRow> videos = new ArrayList<InventoryRow>();

    videos.add(new InventoryRow("Casablanca", "Old", 'Y', null));
    videos.add(new InventoryRow("Jurassic Park", "Regular", 'N', "2015-07-30"));
    videos.add(new InventoryRow("2012", "Regular", 'Y', null));
    videos.add(new InventoryRow("Ant-Man", "New", 'Y', null));

    LocalDate dateReturn = LocalDate.now().plusDays(3);

    LocalDate dateToday = LocalDate.now();

    Scanner input = new Scanner(System.in);

    // Output the prompt
    System.out.println("Do you want to list (l), rent (r) or check (c)?");

    // Wait for the user to enter a line of text
    String line = input.nextLine();

    // List, rent and check functions
    // List function
    if (line.equals("l")) {
        // //////////////////////////// Sort function
        Collections.sort(videos, new Comparator<InventoryRow>() {
            public int compare(InventoryRow o1, InventoryRow o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        for (InventoryRow inventory : videos) {
            System.out.println(inventory);
        }
        // /////////////////////////// Rent function
    } else if (line.equals("r")) {
        System.out.println("Which video would you like to rent?");
        String line2 = input.nextLine();
        // /////////////////////////// Search through ArrayList
        boolean foundIt = false;
        for (InventoryRow ir : videos) {
            if (line2.equals(ir.getName()) && ir.getAvailability() == 'Y') {
                foundIt = true;
                break;
            }
        }
        if (foundIt) {
            System.out.println("Video available to rent! Would you like to rent this video?");
            String line3 = input.nextLine();
            if (line3.equals("Yes")) {
                System.out.println("You have rented this video until " + dateReturn + ".");
                for (InventoryRow ir : videos) {
                    if (ir != null && line2.equals(ir.getName())) {
                        ir.setAvailability('N');
                        ir.setReturndate(dateReturn.toString());
                        // //////////////// Just to test if this works
                        for (InventoryRow inventory : videos) {
                            System.out.println(inventory);
                        }
                    }
                }
            } else {
                System.out.println("You have not rented this video.");
            }

        } else {
            System.out.println("Video unavailable to rent.");
        }
        // /////////////////////////// Check function
    } else if (line.equals("c")) {
        System.out.println("Which video would you like to check is in the inventory?");
        String line4 = input.nextLine();
        // /////////////////////////// Search through ArrayList
        boolean foundIt = false;
        for (InventoryRow ir : videos) {
            if (line4.equals(ir.getName())) {
                foundIt = true;
                break;
            }
        }
        if (foundIt) {
            System.out.println("Video found!");
            for (InventoryRow ir : videos) {
                LocalDate returnDate = LocalDate.parse(ir.getReturndate());
                if (line4.equals(ir.getName()) && ir.getAvailability() == 'N' && returnDate.isEqual(dateToday)) {
                    System.out.println("Video due for return today.");
                } else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N'
                        && returnDate.isBefore(dateToday)) {
                    System.out.println("Video is overdue!");
                } else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N') {
                    System.out.println("Video is due for return on: " + ir.getReturndate());

                }
            }
        } else {
            System.out.println("Video not found. Please see the inventory below.");
            Collections.sort(videos, new Comparator<InventoryRow>() {
                public int compare(InventoryRow o1, InventoryRow o2) {
                    return o1.getName().compareTo(o2.getName());
                }
            });
            for (InventoryRow inventory : videos) {
                System.out.println(inventory);
            }
        }
        // /////////////////////////// If anything else is entered
    } else {
        System.out.println("The only options are to list (l), rent (r) or check (c).");
    }

}
}

这是行不通的,我也不知道为什么:

if (foundIt) {
            System.out.println("Video found!");
            for (InventoryRow ir : videos) {
                LocalDate returnDate = LocalDate.parse(ir.getReturndate());
                if (line4.equals(ir.getName()) && ir.getAvailability() == 'N' && returnDate.isEqual(dateToday)) {
                    System.out.println("Video due for return today.");
                } else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N'
                        && returnDate.isBefore(dateToday)) {
                    System.out.println("Video is overdue!");
                } else if (line4.equals(ir.getName()) && ir.getAvailability() == 'N') {
                    System.out.println("Video is due for return on: " + ir.getReturndate());

                }
            }

这是我收到的错误消息:

Exception in thread "main" java.lang.NullPointerException: text
at java.util.Objects.requireNonNull(Objects.java:228)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1846)
at java.time.LocalDate.parse(LocalDate.java:400)
at java.time.LocalDate.parse(LocalDate.java:385)
at InventorySort.main(InventorySort.java:141)

从您的示例:

//获取今天的日期

  Date todayDate = Calendar.getInstance().getTime(); SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.UK); 

您具有字符串格式的返回日期,如下所示:

videos.add(new InventoryRow(“ Jurassic Park”,“ Regular”,'N',“ 30/07/2015”));

现在,当前日期与返回日期之间的差额:

        Date todayDate = Calendar.getInstance().getTime();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.UK);
        String currDateStr = dateFormat.format(todayDate);
        String returnDateStr = "01/08/2015";
        Date returnDate = null;
        try {
            returnDate = dateFormat.parse(returnDateStr);
            todayDate = dateFormat.parse(currDateStr);
        }
        catch (ParseException e) {
            e.printStackTrace();
        }
        long diffInDays = (todayDate.getTime() - returnDate.getTime()) / (24 * 60 * 60 * 1000);
        if (diffInDays == 0) {
            System.out.println("Video is due today!");
        }
        else if (diffInDays > 0) {
            System.out.println("Video is overdue :(");
        }
        else {
            System.out.println("Video returned in advance :) ");
        }

您可以做的一件事是,将隐含日期的字符串转换为数字,而不是试图隐蔽“日期”。 在这种情况下,您可以通过将字符串解析为整数来做到这一点。 例如:

class Example {
    public static void main(String[] args) {
        String Date = "07/30/2015";
        String[] DatesTxt = Date.split("/");
        int[] DatesInt = new int[3];
        for (int i = 0; i < DatesTxt.length; i++) {
            DatesInt[i] = Integer.parseInt(DatesTxt[i]);
        }
        if (DatesInt[1] < 31) {
            System.out.println("And look am comparing dates!");
        }
    }
}

希望这对您有所帮助:)。

  相关解决方案