如何获取日期的星期几?

17

当我手头有一个String类型的日期数组时,我希望能够从Java的Date对象中获取星期几。

SimpleDateFormat  sourceDateformat = new SimpleDateFormat("yyyy-MM-dd");
public String[] temp_date;
public Int[] day = new Int[5];
Date[] d1= new Date[5];
Calendar[] cal= new Calendar[5]

  try {
     d1[i]= sourceDateformat.parse(temp_date[i].toString());
     cal[i].setTime(d1[i]);   // its not compiling this line..showing error on this line
     day[i]= cal[i].get(Calendar.DAY_OF_WEEK);      
    } 
 catch (ParseException e) {
        e.printStackTrace();
    }

有人知道这个问题的答案吗?


2
什么是错误?你确定你正在使用日历对象期望的正确日期对象(java.util.Date)吗? - dymmeh
6个回答

41

你可以像这样获取天数整数

Calendar c = Calendar.getInstance();
c.setTime(yourdate); // yourdate is an object of type Date

int dayOfWeek = c.get(Calendar.DAY_OF_WEEK); // this will for example return 3 for tuesday

如果你需要输出的是“Tue”而不是数字3,不必通过日历来实现,只需重新格式化字符串:new SimpleDateFormat("EE").format(date) (其中EE表示“星期几的简称”)。

引用自这里:如何确定通过传递特定日期来确定星期几?


请参考以下链接:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#text - Maher Abuthraa
1
不错,但需要做一点更正。2代表星期一,而不是星期二。 - Usman Rana

3
// kotlin

val calendar = Calendar.getInstance()

val dateInfo = DateFormat.getDateInstance(DateFormat.FULL).format(calendar.time)

data.text = dateInfo

5
你好,欢迎来到StackOverflow。这似乎并没有回答问题,而且它所使用的语言与原始问题提出时的语言不同。 - erosenin

1

java.time

您可以使用 DateTimeFormatter.ofPattern("EEEE") 来实现:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        // Test
        System.out.println(getWeekDayName("2021-04-30"));
    }

    public static String getWeekDayName(String s) {
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("u-M-d", Locale.ENGLISH);
        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("EEEE", Locale.ENGLISH);
        return LocalDate.parse(s, dtfInput).format(dtfOutput);
    }
}

输出:

Friday

或者,您可以使用LocalDate#getDayOfWeek获取它:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;

public class Main {
    public static void main(String args[]) {
        // Test
        System.out.println(getWeekDayName("2021-04-30"));
    }

    public static String getWeekDayName(String s) {
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("u-M-d", Locale.ENGLISH);
        return LocalDate.parse(s, dtfInput).getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.ENGLISH);
    }
}

输出:

Friday

了解有关现代日期时间 API*的更多信息,请参阅教程:日期时间


* 无论出于任何原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen-Backport将大多数java.time功能移植到Java 6和7。如果您正在为Android项目工作,并且您的Android API级别仍不符合Java-8,请检查通过解糖可用的Java 8+ API以及如何在Android项目中使用ThreeTenABP


0
在 Kotlin 中,只需要这样做:
val yourDateStr = "2021-01-01"
val df = DateFormat.parse(yourDateStr)
val weedDay = df.getWeekDay(yourTimeZone)

0
以下代码有效,根据您在DAY_OF_WEEK中输入的数字,返回特定的工作日。在这个例子中,它总是返回一个未来的日期,而且这一天将永远是星期二。
DAY_OF_WEEK
public static String getTodaysDateAndTime(){

    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.DATE, 5);
    cal.add(Calendar.DAY_OF_WEEK, 2);
    Date date = cal.getTime();
    SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    String futureDate = dateformat.format(date);
    System.out.println(futureDate);
    return futureDate;
}

这就是Calendar类的混乱之处:对于这个看似简单的任务,你的方法打印并返回了2021-11-22T16:44:53。你承诺是星期二,但11月22日是星期一。我尝试模拟在下周四11月18日运行它,结果给了我2021-11-25T00:00:00,同样是星期四。不要使用Calendar。这太容易让你的代码出错了。 - Ole V.V.

0

随着现代Java日期和时间API的出现,许多事情变得更加容易,其中之一就是这个。

    String tempDate = "2020-03-29";
    LocalDate date = LocalDate.parse(tempDate);
    DayOfWeek day = date.getDayOfWeek();
    System.out.println(day);

输出:

星期日

现在我们已经有了一组枚举来表示一周中的每一天。不再需要使用整数来计算和记住从哪一天开始,并且是否按0或1编号的天数。

我利用了你的预期输入格式(在代码中为 yyyy-MM-dd)是 ISO 8601,这也是 java.time 的默认格式,因此我们不需要明确指定任何格式化程序。

问题: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上使用ThreeTen Backport的Android版本。它被称为ThreeTenABP。并确保从org.threeten.bp子包导入日期和时间类。

链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接