来自 java.time 的本地日期
从用户那里读取开始日期
我建议您要求用户以默认语言环境定义的格式输入日期。用户会很乐意使用他们认为在他们的文化中很常见的格式。为了帮助用户输入正确的格式,首先输出格式和该格式的示例日期。例如:
Locale userLocale = Locale.getDefault(Locale.Category.FORMAT);
String dateFormat = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
FormatStyle.SHORT, null, IsoChronology.INSTANCE, userLocale);
DateTimeFormatter dateFormatter = DateTimeFormatter
.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(userLocale);
LocalDate exampleDate = LocalDate.of(2019, Month.OCTOBER, 23);
System.out.println("Enter start date in format " + dateFormat
+ ", for example " + exampleDate.format(dateFormatter));
在美国语言环境中,这将打印:
以 M/d/yy 格式输入开始日期,例如 10/23/19
例如,在德语语言环境中,输出是不同的:
以 dd.MM.yy 格式输入开始日期,例如 23.10.19
现在从用户那里读取日期作为字符串并使用相同的格式化程序对其进行解析。
LocalDate arrivalDate = null;
do {
String inputDateString = yourInputScanner.nextLine();
try {
arrivalDate = LocalDate.parse(inputDateString, dateFormatter);
} catch (DateTimeParseException dtpe) {
System.out.println(inputDateString + " is not in the correct format, please try again");
}
} while (arrivalDate == null);
如果这是用于图形用户界面,通常会使用日期选择器而不是文本输入。有一些可用的,请使用您的搜索引擎。
从用户那里读取日期范围的长度
让用户输入他们想要停留的周数,1 或 2。通知他们每种情况的结束日期。
LocalDate departureDate7 = arrivalDate.plusWeeks(1);
LocalDate departureDate14 = arrivalDate.plusWeeks(2);
System.out.println("Enter the number of weeks of the stay,"
+ " 1 for departure date " + departureDate7.format(dateFormatter)
+ ", 2 for departure date " + departureDate14.format(dateFormatter));
示例输出(美国语言环境,输入 12/20/19):
输入停留周数,1 表示出发日期 12/27/19,
2 出发日期为 20 年 1 月 3 日
根据用户输入选择相应的出发日期。
避免使用 Date 和 SimpleDateFormat
其他答案中使用的 Date 和 SimpleDateFormat 类设计不佳,后者出了名的麻烦。它们也早已过时。不要使用它们。相反,我使用的是现代 Java 日期和时间 API java.time。 LocalDate 是一个没有时间的日期,这似乎是您需要的。
链接