如何获取星期几、月几、月和年?

How to get day of the week, day of month, month and year?

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

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);
}

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

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

参考文档 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.time

java.util 日期时间 API 及其格式 API、SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*.

解决方案使用 java.time,现代日期时间 API: 使用 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. Check this answer and this answer 了解有关现代日期时间 API 的更多信息,以了解如何将 java.time API 与 JDBC 一起使用.


* 如果您正在为 Android 项目工作,并且您的 Android API 水平仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring. Note that Android 8.0 Oreo already provides support for java.time

java.time 通过脱糖

考虑使用 java.time,现代 Java 日期和时间 API,作为您的约会工作。让我们先看看如何查看星期几:

    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 日星期一 运行 时,输出是:

Set image to Monday’s image here

之所以有效,是因为 getDayOfWeek() returns 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());
    }

Set image to image for 1st day of month here

自己再次填写最多 31 个。一周中的某一天是一个枚举,而一个月中的某一天是一个普通的 int.

月份的情况类似于星期几,因为我们更喜欢使用枚举。 getMonth() returns Month 枚举的一个实例,在您的 switch 语句中您将有 JANUARYFEBRUARY 等情况

最后 getYear() 再次 returns 和 int,因此年份案例将类似于 2021、2022 等月份的日期

编辑:您问过:

… can you give code to validate both date and month in single switch case? … only for one case its enough for "DATE" and "MONTH"...rest i will do it

如果您对 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.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);

Set image to Image for Nov 1

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上使用脱糖或 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接