我想获得本月的一天(例如第1个星期日,第2个星期二)作为日历。 如何在Android中使用Calendar类实现此目的?谢谢。
答案 0 :(得分:1)
编辑:简洁的解决方案使用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天,第二周是8到14天,依此类推。因此,根据该方案,当星期三在第1周时,我们也知道它必须是该月的第一个星期三。其他数字也一样。
我没有使用您提到的Calendar
类,因为它的设计很差并且已经过时了。相反,我使用的是现代Java日期和时间API java.time。
原始代码(虽然短一些,但需要更多的手工工作):
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开始的,我希望其他字符串与数字对齐。
是的,java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。