1

我有以下情况。

String currentMonth = SEP/2021

这里我要String previous month = AUG/2021.

我怎样才能在java中实现这一点?

4

3 回答 3

6

java.time

您可以使用java.timeAPI 来执行此操作。

import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .parseCaseInsensitive()
                                .appendPattern("MMM/uuuu")
                                .toFormatter(Locale.ROOT);

        String currentMonth = "SEP/2021";

        YearMonth currentYm = YearMonth.parse(currentMonth, dtf);
        YearMonth previousYm = currentYm.minusMonths(1);

        String previousMonth = previousYm.format(dtf);
        System.out.println(previousMonth);

        // If required, convert it into the UPPER CASE
        System.out.println(previousMonth.toUpperCase());
    }
}

输出:

Aug/2021
AUG/2021

ONLINE DEMO

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供java.time.

于 2021-10-14T18:20:52.550 回答
3
    String currentMonth = "Sep/2021";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM/yyyy");
    YearMonth yearMonthCurrent = YearMonth.parse(currentMonth, formatter);
    YearMonth yearMonthPrevious = yearMonthCurrent.minusMonths(1);
    String previousMonth = formatter.format(yearMonthPrevious);
于 2021-10-14T18:46:36.367 回答
0

java.time

我从您的问题中了解到,您的输入和输出都具有相同的格式,并且全部大写月份缩写,这是非标准的。我们当然可以处理。我相信在一些基础工作上付出努力,这样当我开始真正的工作时,我可以用一种简单的方式来完成它。在这种情况下,我正在为您的格式构建一个格式化程序,然后我可以使用它来解析输入和格式化输出。

    Map<Long, String> monthAbbreviations = Arrays.stream(Month.values())
            .collect(Collectors.toMap(m -> Long.valueOf(m.getValue()),
                    m -> m.getDisplayName(
                                    TextStyle.SHORT_STANDALONE, Locale.ENGLISH)
                            .toUpperCase()));
    DateTimeFormatter monthFormatter = new DateTimeFormatterBuilder()
            .appendText(ChronoField.MONTH_OF_YEAR, monthAbbreviations)
            .appendPattern("/u")
            .toFormatter();
    
    String currentMonthInput = "SEP/2021";

    YearMonth currentMonth = YearMonth.parse(currentMonthInput, monthFormatter);
    YearMonth previousMonth = currentMonth.minusMonths(1);
    String previousMonthOutput = previousMonth.format(monthFormatter);
    
    System.out.println(previousMonthOutput);

输出是期望的:

2021 年 8 月

的双参数appendText方法DateTimeFormatterBuilder允许我们为字段定义自己的文本。在这种情况下,我使用它来指定我们的大写月份缩写。该方法接受从数字到文本的映射,因此我们需要一个映射 1=JAN、2=FEB 等。我在从Month枚举值开始的流操作中构建映射。

关联

Oracle 教程:日期时间解释如何使用 java.time。

于 2021-10-15T04:56:58.903 回答