【问题标题】:How to get day of the week, day of month, month and year?如何获取星期几、月份日期、月份和年份?
【发布时间】:2021-12-16 00:46:48
【问题描述】:

下面的代码是查看星期几,现在我想查看日期、月份、年份……如何修改?

import java.util.Calendar

ImageView imageView;

Calendar cal = Calendar.getInstance();

cal.setTime(now_date);

imageView = (ImageView)findViewById(R.id.imageView);

if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
    imageView.setImageResource(R.drawable.IMAGE1);
} else if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY) {
    imageView.setImageResource(R.drawable.IMAGE2);
}

【问题讨论】:

  • JavaScript 不是 JAVA
  • 您正在使用糟糕的日期时间类,这些类在几年前被 JSR 310 中定义的现代 java.time 类所取代。
  • 我建议你不要使用Calendar。该课程设计不良且早已过时。此外,并非所有日历都有一周 7 天,因此您的代码并不总是有效。而是使用来自java.time, the modern Java date and time APILocalDateDayOfWeek。他们总是使用公历和相关日历中已知的 7 天一周。
  • 此代码构建成功但应用无法打开!

标签: java android date google-apps-script calendar


【解决方案1】:

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

使用现代日期时间 API java.time 的解决方案:ZonedDateTime 与适用的 ZoneId 一起使用并从中检索所需的值。

演示:

import java.time.DayOfWeek;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.TextStyle;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        // Specify the applicable ZoneId e.g.
        // ZonedDateTime.now(ZoneId.of("Asia/Kolkata"))
        // to get the current date-time in that timezone
        ZonedDateTime now = ZonedDateTime.now();

        DayOfWeek dow = now.getDayOfWeek();
        System.out.println(dow);

        int weekDayNum = dow.getValue();
        System.out.println(weekDayNum);

        String weekDayName = dow.getDisplayName(TextStyle.FULL, Locale.ENGLISH);
        System.out.println(weekDayName);

        int year = now.getYear();
        System.out.println(year);

        Month month = now.getMonth();
        System.out.println(month);

        int monthValue = month.getValue();
        System.out.println(monthValue);

        int dayOfMonth = now.getDayOfMonth();
        System.out.println(dayOfMonth);

        int dayOfYear = now.getDayOfYear();
        System.out.println(dayOfYear);
    }
}

输出:

MONDAY
1
Monday
2021
NOVEMBER
11
1
305

ONLINE DEMO

Trail: Date Time 了解有关现代日期时间 API 的更多信息。查看this answerthis answer 了解如何将java.time API 与JDBC 结合使用。


* 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring。请注意,Android 8.0 Oreo 已经提供了support for java.time

【讨论】:

    【解决方案2】:

    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 语句中,您将有 JANUARYFEBRUARY 等情况。

    最后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());
        }
    

    替代方案:使用地图

    对于一个稍微高级但也非常优雅的解决方案,而不是冗长的 switchif-else 语句在 EnumMap<DayOfWeek, String> 中定义要用于一周中每一天的图像(如果图像参考R.drawable.IMAGE1String,抱歉,我不了解 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 导入日期和时间类以及子包。

    链接

    【讨论】:

    • 感谢您的回复,您能否提供代码以在单个 switch 案例中验证日期和月份?
    • 不,仅在一种情况下,“DATE”和“MONTH”就足够了……剩下的我会做的
    • 请看我的两个修改。
    【解决方案3】:

    与DAY_OF_WEEK类似,您可以从日历实例中获取其他字段。

    更多详情请查看 Java 文档:https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

    【讨论】:

    • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
    • 酷,下次可能会继续。
    【解决方案4】:

    参考文档 https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html 这样就可以得到周、月、年了

    Date today = new Date(); 
    cal.setTime(today); 
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); 
    int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
    int dayOfYear = cal.get(Calendar.DAY_OF_YEAR);
    

    【讨论】:

    • 我是java新手,所以请指定条件来验证日期、月份和年份 if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2017-01-19
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多