【问题标题】:How to get the weekday of a Date?如何获取日期的工作日?
【发布时间】:2013-09-07 03:48:39
【问题描述】:

当我在 String 中有一个 Date 数组时,我想从 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();
    }

有人知道答案吗?

【问题讨论】:

  • 错误是什么?您确定您使用的是 Calendar 对象所期望的正确日期对象 (java.util.Date)

标签: java android date calendar


【解决方案1】:

你可以像这样得到 day-integer:

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 意思是“星期几,短版” )

取自这里:How to determine day of week by passing specific date?

【讨论】:

【解决方案2】:
// kotlin

val calendar = Calendar.getInstance()

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

data.text = dateInfo

【讨论】:

  • 嗨,欢迎来到 StackOverflow。这似乎没有回答问题,而且它使用的语言与最初的问题不同。
【解决方案3】:

这是随着现代 Java 日期和时间 API java.time 的出现而变得容易得多的众多事情之一。

    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 导入日期和时间类以及子包。

链接

【讨论】:

    【解决方案4】:

    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
    

    从 Trail: Date Time 了解有关 modern date-time API* 的更多信息。


    * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。

    【讨论】:

      【解决方案5】:

      在 Kotlin 中,只需这样做:

      val yourDateStr = "2021-01-01"
      val df = DateFormat.parse(yourDateStr)
      val weedDay = df.getWeekDay(yourTimeZone)
      

      【讨论】:

        【解决方案6】:

        以下代码的工作原理取决于您在 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。代码太容易出错了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        相关资源
        最近更新 更多