簡體   English   中英

獲得第一個星期日,第二個星期二這樣的日子

[英]Get the day like 1st Sunday, 2nd Tuesday

我想將本月的一天(例如第一個星期日,第二個星期二)作為日歷。 如何使用 Android 中的 Calendar 類實現此目的? 謝謝。

java.time 和 ThreeTenABP

編輯:優雅的解決方案使用DateTimeFormatter

    Locale language = Locale.ENGLISH;

    Map<Long, String> ordinalNumber = new HashMap<>(8);
    ordinalNumber.put(1L, "1st");
    ordinalNumber.put(2L, "2nd");
    ordinalNumber.put(3L, "3rd");
    ordinalNumber.put(4L, "4th");
    ordinalNumber.put(5L, "5th");
    DateTimeFormatter dayFormatter = new DateTimeFormatterBuilder()
            .appendText(ChronoField.ALIGNED_WEEK_OF_MONTH, ordinalNumber)
            .appendPattern(" EEEE 'of the month'")
            .toFormatter(language);
            
    LocalDate date = LocalDate.now(ZoneId.of("Pacific/Auckland"));

    String dayString = date.format(dayFormatter);
    
    System.out.println("" + date + " is the " + dayString);

當我剛剛運行這個片段時,它輸出:

2019-06-05 是每個月的第一個星期三

顯然,除了今天在新西蘭的日期之外,您可以輸入任何您希望的日期。

月份對齊周的概念將一個月的第一周定義為第 1 到 7 天,第 2 周是第 8 到 14 天,依此類推。因此,根據此方案,當星期三在第 1 周時,我們也知道它必須是每月的第一個星期三。 其他數字的相同論點。

我沒有使用您提到的Calendar類,因為它的設計很差並且已經過時了。 相反,我使用的是 java.time,現代 Java 日期和時間 API。

原始代碼(有點短,但仍然做了更多的手工工作):

    String[] ordinalNumber = { "0th", "1st", "2nd", "3rd", "4th", "5th" };
    
    LocalDate date = LocalDate.now(ZoneId.of("Pacific/Auckland"));

    DayOfWeek day = date.getDayOfWeek();
    int numberDowOfMonth = date.get(ChronoField.ALIGNED_WEEK_OF_MONTH);
    
    String dayString = String.format(language, "%s %s of the month",
            ordinalNumber[numberDowOfMonth],
            day.getDisplayName(TextStyle.FULL_STANDALONE, language));
    
    System.out.println("" + date + " is the " + dayString);

輸出和上面一樣。

我的ordinalNumber數組有一個未使用的第 0 個元素。 我把它放在那里是因為數組在 Java 中是基於 0 的,我希望其他字符串與數字對齊。

問題:我可以在 Android 上使用 java.time 嗎?

是的,java.time 在較舊和較新的 Android 設備上都能很好地工作。 它只需要至少Java 6

  • 在 Java 8 及更高版本和更新的 Android 設備(從 API 級別 26)中,現代 API 是內置的。
  • 在 Java 6 和 7 中獲得 ThreeTen Backport,現代類的 backport(ThreeTen for JSR 310;請參閱底部的鏈接)。
  • 在(較舊的)Android 上使用 ThreeTen Backport 的 Android 版本。 它被稱為 ThreeTenABP。 並確保使用子包從org.threeten.bp導入日期和時間類。

鏈接

暫無
暫無

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

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