1. 概述

在这个快速教程中,我们将学习如何从Scanner读取日期。我们假设日期格式为yyyy-MM-dd,并且Scanner中只包含这个日期。

2. 将输入解析为LocalDate

Scanner API提供了一个简单的文本扫描器。由于我们的Scanner只有一个元素,我们可以使用next()方法获取它。如果输入格式不明确,可能需要先进行一些预处理

此外,Java 8引入了全新的日期/时间API。让我们创建一个带有给定格式的DateTimeFormatter,并解析得到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);
    }
}

Scanner类实现了AutoCloseable接口,因此我们可以使用try-with-resources语句来创建Scanner。这段代码会自动负责关闭Scanner资源。

总之,我们可以检查代码返回的LocalDate是否与直接解析输入得到的一致。假设我们的类名为DateScanner

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

3. 将输入解析为Date

在Java 8之前,我们可以使用原始的Date API。主要的区别是现在我们需要创建一个DateFormat来解析日期:

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

同样地,我们可以测试方法输出的一致性:

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

另外,需要注意的是try-with-resources在Java 7中引入。在早期版本中,我们需要手动关闭Scanner资源。

4. 总结

在这篇文章中,我们从Scanner输入中解析出了LocalDate。然后,我们看到了使用早期Java Date API的等效代码。

如往常一样,代码可以在GitHub上找到。