java - SimpleDateFormat 但包含当前或明年

标签 java

我正在尝试调整我的方法并接受当前年份或明年(如果日期的第二部分是明年)。

我的代码:

    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/

相关文章:

最方便表示关系数据库的Java对象结构

java - 了解作为实例的应用程序范围内的属性

java - JList 使用自定义 ListCellRenderer 获得错误的尺寸

java - 返回字符串格式错误

java - 为什么 Java 对象是指向指针的指针?

java - 为什么 HTTP 方法 PUT 应该是幂等的而不是实现 RestFul 服务中的 POST?

java - 如何在不读取逗号的情况下从字符串中读取 double 和整数

Java 贷款摊销

java - 包含Thread.sleep的JUnit测试方法

java - 在运行时的 java 类中添加默认构造函数