簡體   English   中英

如何在java中從當前月獲取上個月?

[英]How to get previous month from current month in java?

我有以下場景。

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 月

DateTimeFormatterBuilder的兩個參數appendText方法允許我們為字段定義我們自己的文本。 在這種情況下,我使用它來指定我們的大寫月份縮寫。 該方法接受從數字到文本的映射,因此我們需要一個映射 1=JAN、2=FEB 等。我正在從Month枚舉的值開始的流操作中構建映射。

關聯

Oracle 教程:解釋如何使用 java.time 的日期時間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM