Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In this quick tutorial, we’ll learn to read a Date from a Scanner. We’ll hypothesize that the date format is yyyy-MM-dd and that the date is the only content of the Scanner.

2. Parse Input as LocalDate

The Scanner API provides a simple text scanner. Since our Scanner has a unique element, we’ll use the next() method to get it. Otherwise, we should probably do some preliminary work to parse it first.

Besides, Java 8 introduced a brand new Date/Time API. Let’s create a DateTimeFormatter with the given format and parse the result LocalDate:

LocalDate scanToLocalDate(String input) {
    try (Scanner scanner = new Scanner(input)) {
        String dateString = scanner.next();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return LocalDate.parse(dateString, formatter);
    }
}

The Scanner class implements the AutoCloseable interface, so we could use a try-with-resources to create our Scanner. This block takes responsibility for closing the Scanner resource automatically.

To conclude, we can check that our code returns the same LocalDate we would get by parsing the input directly. Given we named our class DateScanner:

@Test
void whenScanToLocalDate_ThenCorrectLocalDate() {
    String dateString = "2018-09-09";
    assertEquals(LocalDate.parse(dateString, DateTimeFormatter.ofPattern("yyyy-MM-dd")), new DateScanner().scanToLocalDate(dateString));
}

3. Parse Input as Date

With a previous version than Java 8, we can use the original Date API instead. The main difference is we now need to create a DateFormat to parse our Date:

Date scanToDate(String input) throws ParseException {
    try (Scanner scanner = new Scanner(input)) {
        String dateString = scanner.next();
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        return formatter.parse(dateString);
    }
}

Similarly, we can test the coherence of the method’s output:

@Test
void whenScanToDate_ThenCorrectDate() throws ParseException {
    String dateString = "2018-09-09";
    assertEquals(new SimpleDateFormat("yyyy-MM-dd").parse(dateString), new DateScanner().scanToDate(dateString));
}

Additionally, let’s point out that try-with-resources was introduced in Java 7. With an anterior version, we would need to close the Scanner resource manually.

4. Conclusion

In this article, we parsed a Scanner input into a LocalDate. Then, we saw the equivalent code with Java’s early Date API.

As always, the code is available on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.