我正在尝试调整我的方法并接受当前年份或明年(如果日期的第二部分是明年)。
我的代码:
private static final String PERIOD = "24 Dec-2 Jan";
private static DateRange _period = null;
public static void main(final String[] args)
{
_period = DateRange.parse(PERIOD, new SimpleDateFormat("dd MMM", Locale.US));
}
解析方法:
public static DateRange parse(final String dateRange, final DateFormat format)
{
final String[] date = dateRange.split("-");
if (date.length == 2)
{
try
{
final Date startDate = format.parse(date[0]);
final Date endDate = format.parse(date[1]);
return new DateRange(startDate, endDate);
}
catch (final ParseException e)
{
_log.log(Level.WARNING, "Invalid Date Format.", e);
}
}
return new DateRange(null, null);
}
因此,在执行代码后,我希望 _startDate 显示 2020 年 12 月 24 日 和 _endDate 显示 2021 年 1 月 4 日 因为是明年
编辑:当前打印此:
Thu Dec 24 00:00:00 EET 1970
Fri Jan 02 00:00:00 EET 1970
虽然我需要这个
Thu Dec 24 00:00:00 EET 2020
Fri Jan 02 00:00:00 EET 2021
最佳答案
已更新为使用 Java 8 日期 API。您可以在修订历史记录中找到 Java8 之前的版本。
您可以使用 Java 8 日期 API 来解析 MonthDay (部分日期),将其设置为当前年份(使用 LocalDate ),然后调整年份以将日期范围移动到 future 最早的有效范围。
public static DateRange parse(final String dateRange, final DateTimeFormatter formatter) {
final String[] dates = dateRange.split("-");
if (dates.length == 2) {
try {
final LocalDate now = LocalDate.now();
final int currentYear = now.getYear();
int startYear = currentYear, endYear = currentYear;
// Parse partial dates (MonthDay) and set the year to the current year.
LocalDate startDate = MonthDay.parse(dates[0], formatter).atYear(currentYear);
LocalDate endDate = MonthDay.parse(dates[1], formatter).atYear(currentYear);
// Increment both years if the start is in the past.
if (startDate.isBefore(now)) {
startYear++;
endYear++;
}
// Increment the end year if the end is before the start.
if (endDate.isBefore(startDate)) {
endYear++;
}
// Update dates with the years.
startDate = startDate.withYear(startYear);
endDate = endDate.withYear(endYear);
return new DateRange(startDate, endDate);
} catch (DateTimeParseException e) {
_log.log(Level.WARNING, "Invalid Date Format.", e);
}
}
return null;
}
public static void main(String[] args) {
final String dateString = "24 Feb-2 Jan";
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMM", Locale.US);
final DateRange dateRange = parse(dateString, formatter);
System.out.println(dateRange);
}
请注意,格式为 d MMM
而不是 dd MMM
以支持单位数字天数。
或者,如果您需要支持包含年份的日期字符串,则可以使用 LocalDate 解决方案,并在格式化程序参数中添加默认年份。
public static void main(String[] args) {
final String dateString = "24 Feb-2 Jan";
final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("d MMM")
.parseDefaulting(ChronoField.YEAR, Year.now().getValue())
.toFormatter(Locale.US);
final DateRange dateRange = parse(dateString, formatter);
System.out.println(dateRange);
}
public static DateRange parse(final String dateRange, final DateTimeFormatter formatter) {
final String[] dates = dateRange.split("-");
if (dates.length == 2) {
try {
final LocalDate now = LocalDate.now();
final int currentYear = now.getYear();
int startYear = currentYear, endYear = currentYear;
// Parse partial dates (MonthDay) and set the year to the current year.
LocalDate startDate = LocalDate.parse(dates[0], formatter);
LocalDate endDate = LocalDate.parse(dates[1], formatter);
// Increment both years if the start is in the past.
if (startDate.isBefore(now)) {
startYear++;
endYear++;
}
// Increment the end year if the end is before the start.
if (endDate.isBefore(startDate)) {
endYear++;
}
// Update dates with the years.
startDate = startDate.withYear(startYear);
endDate = endDate.withYear(endYear);
return new DateRange(startDate, endDate);
} catch (DateTimeParseException e) {
_log.log(Level.WARNING, "Invalid Date Format.", e);
}
}
return null;
}
关于java - SimpleDateFormat 但包含当前或明年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61720407/