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上找到。