java.time 脱糖
考虑使用现代 Java 日期和时间 API java.time 进行日期工作。让我们先看看如何检查星期几:
LocalDate today = LocalDate.now(ZoneId.systemDefault());
switch (today.getDayOfWeek()) {
case MONDAY:
System.out.println("Set image to Monday’s image here");
break;
case TUESDAY:
System.out.println("Set image to Tuesday’s image here");
break;
default:
throw new AssertionError("Unsupported day of week: " + today.getDayOfWeek());
}
我相信您自己填写一周中剩余的五天,并按照您的问题设置图像视图的图像资源。我的代码是这样的,当我在 11 月 1 日星期一运行它时,输出是:
在此处将图像设置为星期一的图像
之所以有效,是因为getDayOfWeek() 返回了DayOfWeek 枚举的一个实例,而Java 允许我们打开枚举。
当月的某天:
switch (today.getDayOfMonth()) {
case 1:
System.out.println("Set image to image for 1st day of month here");
break;
case 2:
System.out.println("Set image to image for 2nd day of month here");
break;
default:
throw new AssertionError("Unsupported day of month: " + today.getDayOfWeek());
}
在此处将图像设置为每月第一天的图像
再次自己填写最多 31 个。虽然一周中的一天是一个枚举,但一个月中的一天是一个普通的 int。
月份的情况类似于星期几,因为我们更喜欢使用枚举。 getMonth() 返回 Month 枚举的一个实例,在您的 switch 语句中,您将有 JANUARY、FEBRUARY 等情况。
最后getYear() 再次返回int,因此年份大小写与月份中的某天类似,例如 2021、2022 等。
编辑:你问:
…你能提供代码来验证单次开关中的日期和月份吗
案子? ...仅对于一种情况,“DATE”和“MONTH”就足够了...休息我
会做的
如果您对 switch 语句感到满意,您也可以将它们相互嵌套:
switch (today.getMonth()) {
case JANUARY:
switch (today.getDayOfMonth()) {
case 1:
System.out.println("Set image to image for 1st day of January here");
break;
// …
default:
throw new AssertionError("Unsupported day of January: " + today.getDayOfWeek());
}
break;
// …
default:
throw new AssertionError("Unsupported month: " + today.getMonth());
}
替代方案:使用地图
对于一个稍微高级但也非常优雅的解决方案,而不是冗长的 switch 或 if-else 语句在 EnumMap<DayOfWeek, String> 中定义要用于一周中每一天的图像(如果图像参考R.drawable.IMAGE1 是 String,抱歉,我不了解 Android,所以无法分辨)。对于一个月中的某一天,您可以使用 HashMap<Integer, String> 或字符串数组。
编辑:我认为地图方法在结合月份和月份时变得特别有吸引力。我在这里使用 Java 9 语法,希望它可以与脱糖一起使用,这不是我所知道的:
private static final Map<MonthDay, String> IMAGES_PER_DAY
= Map.ofEntries(
Map.entry(MonthDay.of(Month.JANUARY, 1), "Image for Jan 1"),
Map.entry(MonthDay.of(Month.JANUARY, 2), "Image for Jan 2"),
// …
Map.entry(MonthDay.of(Month.NOVEMBER, 1), "Image for Nov 1"),
// …
Map.entry(MonthDay.of(Month.DECEMBER, 31), "Image for Dec 31"));
现在为今天的日期选择正确的图像非常简单:
String imageReference = IMAGES_PER_DAY.get(MonthDay.from(today));
System.out.println("Set image to " + imageReference);
将图像设置为 11 月 1 日的图像
问题:java.time 不需要 Android API 26 级吗?
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
- 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
- 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从
org.threeten.bp 导入日期和时间类以及子包。
链接