得到像第一个星期天,第二个星期二这样的日子

Get the day like 1st Sunday, 2nd Tuesday

我想获取本月的第一个星期日、第二个星期二作为日历。 如何使用 Android 中的 class 日历实现此目的?谢谢。

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 is the 1st Wednesday of the month

显然,除了今天在新西兰的日期外,您可以输入任何您希望的日期。

对齐周的概念定义了一个月的第一周是从第 1 天到第 7 天,第 2 周是从第 8 天到第 14 天,等等。所以根据这个方案,当星期三在第 1 周时,我们也知道它必须是该月的第一个星期三。其他数字的参数相同。

我没有使用您提到的 Calendar class,因为它设计不佳且早已过时。相反,我使用 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 出现 built-in.
  • 在 Java 6 和 7 中获取 ThreeTen Backport,现代 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接