我有以下情况。
String currentMonth = SEP/2021
这里我要String previous month = AUG/2021.
我怎样才能在java中实现这一点?
您可以使用java.time
API 来执行此操作。
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
从Trail: Date Time了解有关现代日期时间 API *的更多信息。
* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供对java.time
.
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);
我从您的问题中了解到,您的输入和输出都具有相同的格式,并且全部大写月份缩写,这是非标准的。我们当然可以处理。我相信在一些基础工作上付出努力,这样当我开始真正的工作时,我可以用一种简单的方式来完成它。在这种情况下,我正在为您的格式构建一个格式化程序,然后我可以使用它来解析输入和格式化输出。
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。