将字符串转换为日期并在ArrayList Java

时间:2015-07-30 18:50:06

标签: java string date arraylist calendar

我对编程和Java都是全新的,所以请原谅任何愚蠢的错误和非常糟糕的代码(我不知道如何订购/格式化)。我有一个任务是制作一个视频清单,它有三个功能:列表,租金和支票。我有一个ArrayList,它保存当前可用的视频库存。在check函数下,我希望能够将returnsndate字符串转换为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)

2 个答案:

答案 0 :(得分:1)

来自您的示例:

  

//获取今天的日期

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

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

  

videos.add(新的InventoryRow(“侏罗纪公园”,“常规”,'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 :) ");
        }

答案 1 :(得分:0)

你能做的一件事就是不要试图隐瞒日期&#34;是将表示日期的字符串转换为数字。这样做的方法是在这种情况下将String解析为Integer。例如:

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!");
        }
    }
}

我希望这有助于:)。