如何通过特定的日期来确定星期几?

时间:2022-10-21 10:39:00

For Example I have the date: "23/2/2010" (23th Feb 2010). I want to pass it to a function which would return the day of week. How can I do this?

例如,我有日期:“23/2/2010”(2010年2月23日)。我想把它传递给一个函数,它会返回一周的一天。我该怎么做呢?

In this example, the function should return String "Tue".

在本例中,函数应该返回字符串“Tue”。

Additionally, if just the day ordinal is desired, how can that be retrieved?

另外,如果只需要日序数,该如何检索?

19 个解决方案

#1


263  

Yes. Depending on your exact case:

是的。视乎你的具体情况而定:

  • You can use java.util.Calendar:

    您可以使用java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
    
  • if you need the output to be Tue rather than 3 (Days of week are indexed starting at 1), instead of going through a calendar, just reformat the string: new SimpleDateFormat("EE").format(date) (EE meaning "day of week, short version")

    如果您需要的输出是Tue而不是3(星期数从1开始索引),而不是通过日历,而是重新格式化字符串:新的SimpleDateFormat(“EE”).format(日期)(EE的意思是“week, short version”)

  • if you have your input as string, rather than Date, you should use SimpleDateFormat to parse it: new SimpleDateFormat("dd/M/yyyy").parse(dateString)

    如果您的输入是字符串,而不是日期,您应该使用SimpleDateFormat来解析它:new SimpleDateFormat(“dd/M/ yyyyyyy”).parse(dateString)

  • you can use joda-time's DateTime and call dateTime.dayOfWeek() and/or DateTimeFormat.

    您可以使用joda-time的DateTime并调用DateTime . dayofweek()和/或DateTimeFormat。

#2


48  

  String input_date="01/08/2012";
  SimpleDateFormat format1=new SimpleDateFormat("dd/MM/yyyy");
  Date dt1=format1.parse(input_date);
  DateFormat format2=new SimpleDateFormat("EEEE"); 
  String finalDay=format2.format(dt1);

Use this code for find the Day name from a input date.Simple and well tested.

使用此代码从输入日期查找日名。简单的和很好的测试。

#3


20  

Simply use SimpleDateFormat stufs :)

只需使用SimpleDateFormat存根:)

SimpleDateFormat newDateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date MyDate = newDateFormat.parse("28/12/2013");
newDateFormat.applyPattern("EEEE d MMM yyyy")
String MyDate = newDateFormat.format(MyDate);

The result is: Saturday 28 Dec 2013.

结果是:2013年12月28日星期六。

If you want diferent positions just replace it at applyPattern method.

如果你想要不同的位置,就用applyPattern的方法替换它。

But if you want only the day of the week leave it like that:

但如果你只想要一周中的一天,那就这样离开:

newDateFormat.applyPattern("EEEE")

#4


15  

tl;dr

Using java.time

使用java.time…

LocalDate.parse(                               // Generate `LocalDate` object from String input.
             "23/2/2010" ,
             DateTimeFormatter.ofPattern( "d/M/uuuu" ) 
         )                                    
         .getDayOfWeek()                       // Get `DayOfWeek` enum object.
         .getDisplayName(                      // Localize. Generate a String to represent this day-of-week.
             TextStyle.SHORT_STANDALONE ,      // How long or abbreviated. Some languages have an alternate spelling for "standalone" use (not so in English).
             Locale.US                         // Or Locale.CANADA_FRENCH and such. Specify a `Locale` to determine (1) human language for translation, and (2) cultural norms for abbreviation, punctuation, etc.
         ) 

Tue

星期二

See this code run live at IdeOne.com (but only Locale.US works there).

请查看此代码在IdeOne.com上实时运行(但只在Locale)。我们在那里工作)。

java.time

See my example code above, and see the correct Answer for java.time by Przemek.

请参见上面的示例代码,并查看java的正确答案。由Przemek时间。

Ordinal number

if just the day ordinal is desired, how can that be retrieved?

如果只是想要一天的序数,那怎么能取回呢?

For ordinal number, consider passing around the DayOfWeek enum object instead such as DayOfWeek.TUESDAY. Keep in mind that a DayOfWeek is a smart object, not just a string or mere integer number. Using those enum objects makes your code more self-documenting, ensures valid values, and provides type-safety.

对于序数,可以考虑将周数作为周数,比如周数。请记住,每周的一天是一个聪明的对象,而不仅仅是一个字符串或一个整数。使用这些enum对象可以使代码更加自文档化,确保有效的值,并提供类型安全。

But if you insist, ask DayOfWeek for a number. You get 1-7 for Monday-Sunday per the ISO 8601 standard.

但是如果你坚持的话,可以每周找一天的时间问一个数字。根据ISO 8601标准,您星期一至星期天可获得1-7。

int ordinal = myLocalDate.getDayOfWeek().getValue() ;

Joda-Time

UPDATE: The Joda-Time project is now in maintenance mode. The team advises migrating to the java.time classes. The java.time framework is built into Java 8 (as well as back-ported to Java 6 & 7 and further adapted to Android).

更新:Joda-Time项目现在处于维护模式。团队建议迁移到java。时间类。java。时间框架构建于Java 8(以及向后移植到Java 6 & 7,并进一步适应Android)。

Here is example code using the Joda-Time library version 2.4, as mentioned in the accepted answer by Bozho. Joda-Time is far superior to the java.util.Date/.Calendar classes bundled with Java.

这里是使用Joda-Time库版本2.4的示例代码,如Bozho所接受的答案中所提到的。Joda-Time远远优于java.util.Date/。与Java绑定的日历类。

LocalDate

Joda-Time offers the LocalDate class to represent a date-only without any time-of-day or time zone. Just what this Question calls for. The old java.util.Date/.Calendar classes bundled with Java lack this concept.

Joda-Time提供LocalDate类来表示一个没有任何时间或时区的日期。这正是这个问题所要求的。*ava.util.Date /。与Java绑定的日历类缺乏这个概念。

Parse

Parse the string into a date value.

将字符串解析为日期值。

String input = "23/2/2010";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "d/M/yyyy" );
LocalDate localDate = formatter.parseLocalDate( input );

Extract

Extract from the date value the day of week number and name.

从日期值中提取星期数和名称。

int dayOfWeek = localDate.getDayOfWeek(); // Follows ISO 8601 standard, where Monday = 1, Sunday = 7.
Locale locale = Locale.US;  // Locale specifies the human language to use in determining day-of-week name (Tuesday in English versus Mardi in French).
DateTimeFormatter formatterOutput = DateTimeFormat.forPattern( "E" ).withLocale( locale );
String output = formatterOutput.print( localDate ); // 'E' is code for abbreviation of day-of-week name. See Joda-Time doc.
String outputQuébécois = formatterOutput.withLocale( Locale.CANADA_FRENCH ).print( localDate );

Dump

Dump to console.

转储到控制台。

System.out.println( "input: " + input );
System.out.println( "localDate: " + localDate ); // Defaults to ISO 8601 formatted strings.
System.out.println( "dayOfWeek: " + dayOfWeek );
System.out.println( "output: " + output );
System.out.println( "outputQuébécois: " + outputQuébécois );

Run

When run.

运行时。

input: 23/2/2010
localDate: 2010-02-23
dayOfWeek: 2
output: Tue
outputQuébécois: mar.

About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

java。time框架被构建到Java 8以及以后的版本中。这些类取代了麻烦的旧遗留日期时间类(如java.util)。日期,日历,& SimpleDateFormat。

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

现在处于维护模式的Joda-Time项目建议迁移到java。时间类。

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

要了解更多信息,请参阅Oracle教程。和搜索堆栈溢出为许多例子和解释。规范是JSR 310。

Where to obtain the java.time classes?

在哪里获得java。时间类?

  • Java SE 8, Java SE 9, and later
    • Built-in.
    • 内置的。
    • Part of the standard Java API with a bundled implementation.
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9 adds some minor features and fixes.
    • Java 9添加了一些次要的特性和修复。
  • Java SE 8, Java SE 9,以及后来的内置。带有捆绑实现的标准Java API的一部分。Java 9添加了一些次要的特性和修复。
  • Java SE 6 and Java SE 7
    • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
    • 大部分java。时间功能在三个回端移植到Java 6和7。
  • Java SE 6和Java SE 7大部分的Java。时间功能在三个回端移植到Java 6和7。
  • Android
    • The ThreeTenABP project adapts ThreeTen-Backport (mentioned above) for Android specifically.
    • ThreeTenABP项目特别适用于Android。
    • See How to use ThreeTenABP….
    • 看到如何使用ThreeTenABP ....
  • Android的ThreeTenABP项目特别适用于Android的ThreeTen-Backport(上面提到的)。看到如何使用ThreeTenABP ....

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

三个额外的项目扩展了java。时间和额外的类。这个项目是java.time未来可能增加的一个试验场。您可以在这里找到一些有用的课程,如间隔、年周、年季等。

#5


8  

java.time

Using java.time framework built into Java 8 and later.

使用java。Java 8及以后的时间框架。

The DayOfWeek enum can generate a String of the day’s name automatically localized to the human language and cultural norms of a Locale. Specify a TextStyle to indicate you want long form or abbreviated name.

一天的enum可以生成一个日期的字符串,自动定位到语言和语言环境的文化规范。指定一个TextStyle来指示要使用长表单或缩写名。

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

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy");
LocalDate date = LocalDate.parse("23/2/2010", formatter); // LocalDate = 2010-02-23
DayOfWeek dow = date.getDayOfWeek();  // Extracts a `DayOfWeek` enum object.
String output = dow.getDisplayName(TextStyle.SHORT, Locale.US); // String = Tue

#6


5  

Another "fun" way is to use Doomsday algorithm. It's a way longer method but it's also faster if you don't need to create a Calendar object with a given date.

另一个“有趣”的方法是使用末日算法。这是一种更长的方法,但如果不需要创建具有给定日期的日历对象,它也更快。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 *
 * @author alain.janinmanificat
 */
public class Doomsday {

    public static HashMap<Integer, ArrayList<Integer>> anchorDaysMap = new HashMap<>();
    public static HashMap<Integer, Integer> doomsdayDate = new HashMap<>();
    public static String weekdays[] = new DateFormatSymbols(Locale.FRENCH).getWeekdays();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws ParseException, ParseException {

        // Map is fed manually but we can use this to calculate it : http://en.wikipedia.org/wiki/Doomsday_rule#Finding_a_century.27s_anchor_day
        anchorDaysMap.put(Integer.valueOf(0), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1700));
                add(Integer.valueOf(2100));
                add(Integer.valueOf(2500));
            }
        });

        anchorDaysMap.put(Integer.valueOf(2), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1600));
                add(Integer.valueOf(2000));
                add(Integer.valueOf(2400));
            }
        });

        anchorDaysMap.put(Integer.valueOf(3), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1500));
                add(Integer.valueOf(1900));
                add(Integer.valueOf(2300));
            }
        });

        anchorDaysMap.put(Integer.valueOf(5), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1800));
                add(Integer.valueOf(2200));
                add(Integer.valueOf(2600));
            }
        });

        //Some reference date that always land on Doomsday
        doomsdayDate.put(Integer.valueOf(1), Integer.valueOf(3));
        doomsdayDate.put(Integer.valueOf(2), Integer.valueOf(14));
        doomsdayDate.put(Integer.valueOf(3), Integer.valueOf(14));
        doomsdayDate.put(Integer.valueOf(4), Integer.valueOf(4));
        doomsdayDate.put(Integer.valueOf(5), Integer.valueOf(9));
        doomsdayDate.put(Integer.valueOf(6), Integer.valueOf(6));
        doomsdayDate.put(Integer.valueOf(7), Integer.valueOf(4));
        doomsdayDate.put(Integer.valueOf(8), Integer.valueOf(8));
        doomsdayDate.put(Integer.valueOf(9), Integer.valueOf(5));
        doomsdayDate.put(Integer.valueOf(10), Integer.valueOf(10));
        doomsdayDate.put(Integer.valueOf(11), Integer.valueOf(7));
        doomsdayDate.put(Integer.valueOf(12), Integer.valueOf(12));

        long time = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {

            //Get a random date
            int year = 1583 + new Random().nextInt(500);
            int month = 1 + new Random().nextInt(12);
            int day = 1 + new Random().nextInt(7);

            //Get anchor day and DoomsDay for current date
            int twoDigitsYear = (year % 100);
            int century = year - twoDigitsYear;
            int adForCentury = getADCentury(century);
            int dd = ((int) twoDigitsYear / 12) + twoDigitsYear % 12 + (int) ((twoDigitsYear % 12) / 4);

            //Get the gap between current date and a reference DoomsDay date
            int referenceDay = doomsdayDate.get(month);
            int gap = (day - referenceDay) % 7;

            int result = (gap + adForCentury + dd) % 7;

            if(result<0){
                result*=-1;
            }
            String dayDate= weekdays[(result + 1) % 8];
            //System.out.println("day:" + dayDate);
        }
        System.out.println("time (ms) : " + (System.currentTimeMillis() - time)); //time (ms) : 80

         time = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            Calendar c = Calendar.getInstance();
            //I should have used random date here too, but it's already slower this way
            c.setTime(new SimpleDateFormat("dd/MM/yyyy").parse("12/04/1861"));
//            System.out.println(new SimpleDateFormat("EE").format(c.getTime()));
            int result2 = c.get(Calendar.DAY_OF_WEEK);
//            System.out.println("day idx :"+ result2);
        }
        System.out.println("time (ms) : " + (System.currentTimeMillis() - time)); //time (ms) : 884
    }

    public static int getADCentury(int century) {
        for (Map.Entry<Integer, ArrayList<Integer>> entry : anchorDaysMap.entrySet()) {
            if (entry.getValue().contains(Integer.valueOf(century))) {
                return entry.getKey();
            }
        }
        return 0;
    }
}

#7


4  

public class TryDateFormats {
    public static void main(String[] args) throws ParseException {
        String month = "08";
        String day = "05";
        String year = "2015";
        String inputDateStr = String.format("%s/%s/%s", day, month, year);
        Date inputDate = new SimpleDateFormat("dd/MM/yyyy").parse(inputDateStr);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(inputDate);
        String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US).toUpperCase();
        System.out.println(dayOfWeek);
    }
}

#8


4  

...
import java.time.LocalDate;
...
//String month = in.next();
int mm = in.nextInt();
//String day = in.next();
int dd = in.nextInt();
//String year = in.next();
int yy = in.nextInt();
in.close();
LocalDate dt = LocalDate.of(yy, mm, dd);
System.out.print(dt.getDayOfWeek());

#9


3  

private String getDay(Date date){

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");
    //System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());                       
    return simpleDateFormat.format(date).toUpperCase();
}

private String getDay(String dateStr){
    //dateStr must be in DD-MM-YYYY Formate
    Date date = null;
    String day=null;

    try {
        date = new SimpleDateFormat("DD-MM-YYYY").parse(dateStr);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");
        //System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());
        day = simpleDateFormat.format(date).toUpperCase();


    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    return day;
}

#10


3  

You can try the following code:

您可以尝试以下代码:

import java.time.*;

public class Test{
   public static void main(String[] args) {
      DayOfWeek dow = LocalDate.of(2010,Month.FEBRUARY,23).getDayOfWeek();
      String s = String.valueOf(dow);
      System.out.println(String.format("%.3s",s));
   }
}

#11


2  

import java.text.SimpleDateFormat;

import java.util.Scanner;

class DayFromDate

{

 public static void main(String args[])

 {

    System.out.println("Enter the date(dd/mm/yyyy):");
    Scanner scan=new Scanner(System.in);
    String Date=scan.nextLine();
    try{
        boolean dateValid=dateValidate(Date);
        if(dateValid==true)
        {
            SimpleDateFormat df = new SimpleDateFormat( "dd/MM/yy" );  
            java.util.Date date = df.parse(Date);   
            df.applyPattern( "EEE" );  
            String day= df.format( date ); 
            if(day.compareTo("Sat")==0|| day.compareTo("Sun")==0)
            {
                System.out.println(day+": Weekend");
            }
            else
            {
                System.out.println(day+": Weekday");
            }
        }
        else
        {
            System.out.println("Invalid Date!!!");
        }
    }
    catch(Exception e)
    {
        System.out.println("Invalid Date Formats!!!");
    }
 }

static public boolean dateValidate(String d)

 {

    String dateArray[]= d.split("/");
    int day=Integer.parseInt(dateArray[0]);
    int month=Integer.parseInt(dateArray[1]);
    int year=Integer.parseInt(dateArray[2]);
    System.out.print(day+"\n"+month+"\n"+year+"\n");
    boolean leapYear=false;

    if((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
    {
         leapYear=true;
    }

    if(year>2099 || year<1900)
        return false;

    if(month<13)
    {
        if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
        {
            if(day>31)
                return false;
        }
        else if(month==4||month==6||month==9||month==11)
        {
            if(day>30)
                return false;
        }
        else if(leapYear==true && month==2)
        {
            if(day>29)
              return false;
        }
        else if(leapYear==false && month==2)
        {
            if(day>28)
              return false;
        }
        return true;    
    }
    else return false;
 }
}

#12


1  

Calendar cal = Calendar.getInstance(desired date);
cal.setTimeInMillis(System.currentTimeMillis());
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

Get the day value by providing the current time stamp.

通过提供当前时间戳获取日值。

#13


1  

LocalDate date=LocalDate.now();

System.out.println(date.getDayOfWeek());//prints THURSDAY
System.out.println(date.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.US) );  //prints Thu   
java.time.DayOfWeek is a enum which returns the singleton instance for the day-of-week of the weekday of the date.

#14


1  

Can use the following code snippet for input like (day = "08", month = "05", year = "2015" and output will be "WEDNESDAY")

可以使用以下代码片段进行输入(day = "08", month = "05", year = "2015",输出为"WEDNESDAY")

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day));
calendar.set(Calendar.MONTH, (Integer.parseInt(month)-1));
calendar.set(Calendar.YEAR, Integer.parseInt(year));
String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US).toUpperCase();

#15


0  

You can use below method to get Day of the Week by passing a specific date,

你可以用下面的方法,通过一个特定的日期来获得一周的一天,

Here for the set method of Calendar class, Tricky part is the index for the month parameter will starts from 0.

这里对于Calendar类的set方法,棘手的部分是月参数的索引将从0开始。

public static String getDay(int day, int month, int year) {

        Calendar cal = Calendar.getInstance();

        if(month==1){
            cal.set(year,0,day);
        }else{
            cal.set(year,month-1,day);
        }

        int dow = cal.get(Calendar.DAY_OF_WEEK);

        switch (dow) {
        case 1:
            return "SUNDAY";
        case 2:
            return "MONDAY";
        case 3:
            return "TUESDAY";
        case 4:
            return "WEDNESDAY";
        case 5:
            return "THURSDAY";
        case 6:
            return "FRIDAY";
        case 7:
            return "SATURDAY";
        default:
            System.out.println("GO To Hell....");
        }

        return null;
    }

#16


0  

Program to find the day of the week by giving user input date month and year using java.util.scanner package.

通过使用java.util提供用户输入日期、月份和年份来找到一周的一天。扫描仪包。

import java.util.Scanner;

public class Calender{
  public static String getDay(String day, String month, String year) {

    int ym, yp, d, ay, a=0;
    int by = 20;
    int y[]=new int []{6,4,2,0};
    int m[]=new int []{0,3,3,6,1,4,6,2,5,0,3,5};

    String wd[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

    int gd=Integer.parseInt(day);
    int gm=Integer.parseInt(month);
    int gy=Integer.parseInt(year);

    ym=gy%100;
    yp=ym/4;
    ay=gy/100;

    while (ay!=by) {
        by=by+1;
        a=a+1;
        if(a==4) {
            a=0;
        }
    }

    if ((ym%4==0) && (gm==2)){
        d=(gd+m[gm-1]+ym+yp+y[a]-1)%7;
    }
    else
    d = (gd+m[gm-1]+ym+yp+y[a])%7;
    return wd[d];
}

 public static void main(String[] args){

     Scanner in = new Scanner(System.in);

     String day = in.next();
     String month = in.next();
     String year = in.next();

    System.out.println(getDay(day, month, year));
 }
}

#17


0  

One line answer:

一行的回答:

return LocalDate.parse("06/02/2018",DateTimeFormatter.ofPattern("dd/MM/yyyy")).getDayOfWeek().name();

Usage Example:

使用的例子:

public static String getDayOfWeek(String date){
  return LocalDate.parse(date, DateTimeFormatter.ofPattern("dd/MM/yyyy")).getDayOfWeek().name();
}

public static void callerMethod(){
   System.out.println(getDayOfWeek("06/02/2018")); //TUESDAY
}

#18


0  

Calendar class has build-in displayName functionality:

Calendar类具有内建的显示名称功能:

Calendar.getInstance().getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.getDefault()); // Thu   

Calendar.SHORT -> Thu
Calendar.LONG_FORMAT -> Thursday

Available since Java 1.6. See also Oracle documentation

因为Java 1.6。参见甲骨文文档

#19


-1  

Below is the two line of snippet using Java 1.8 Time API for your Requirement.

下面是使用Java 1.8 Time API满足您的需求的两行代码片段。

LocalDate localDate = LocalDate.of(Integer.valueOf(year),Integer.valueOf(month),Integer.valueOf(day));
String dayOfWeek = String.valueOf(localDate.getDayOfWeek());

#1


263  

Yes. Depending on your exact case:

是的。视乎你的具体情况而定:

  • You can use java.util.Calendar:

    您可以使用java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
    
  • if you need the output to be Tue rather than 3 (Days of week are indexed starting at 1), instead of going through a calendar, just reformat the string: new SimpleDateFormat("EE").format(date) (EE meaning "day of week, short version")

    如果您需要的输出是Tue而不是3(星期数从1开始索引),而不是通过日历,而是重新格式化字符串:新的SimpleDateFormat(“EE”).format(日期)(EE的意思是“week, short version”)

  • if you have your input as string, rather than Date, you should use SimpleDateFormat to parse it: new SimpleDateFormat("dd/M/yyyy").parse(dateString)

    如果您的输入是字符串,而不是日期,您应该使用SimpleDateFormat来解析它:new SimpleDateFormat(“dd/M/ yyyyyyy”).parse(dateString)

  • you can use joda-time's DateTime and call dateTime.dayOfWeek() and/or DateTimeFormat.

    您可以使用joda-time的DateTime并调用DateTime . dayofweek()和/或DateTimeFormat。

#2


48  

  String input_date="01/08/2012";
  SimpleDateFormat format1=new SimpleDateFormat("dd/MM/yyyy");
  Date dt1=format1.parse(input_date);
  DateFormat format2=new SimpleDateFormat("EEEE"); 
  String finalDay=format2.format(dt1);

Use this code for find the Day name from a input date.Simple and well tested.

使用此代码从输入日期查找日名。简单的和很好的测试。

#3


20  

Simply use SimpleDateFormat stufs :)

只需使用SimpleDateFormat存根:)

SimpleDateFormat newDateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date MyDate = newDateFormat.parse("28/12/2013");
newDateFormat.applyPattern("EEEE d MMM yyyy")
String MyDate = newDateFormat.format(MyDate);

The result is: Saturday 28 Dec 2013.

结果是:2013年12月28日星期六。

If you want diferent positions just replace it at applyPattern method.

如果你想要不同的位置,就用applyPattern的方法替换它。

But if you want only the day of the week leave it like that:

但如果你只想要一周中的一天,那就这样离开:

newDateFormat.applyPattern("EEEE")

#4


15  

tl;dr

Using java.time

使用java.time…

LocalDate.parse(                               // Generate `LocalDate` object from String input.
             "23/2/2010" ,
             DateTimeFormatter.ofPattern( "d/M/uuuu" ) 
         )                                    
         .getDayOfWeek()                       // Get `DayOfWeek` enum object.
         .getDisplayName(                      // Localize. Generate a String to represent this day-of-week.
             TextStyle.SHORT_STANDALONE ,      // How long or abbreviated. Some languages have an alternate spelling for "standalone" use (not so in English).
             Locale.US                         // Or Locale.CANADA_FRENCH and such. Specify a `Locale` to determine (1) human language for translation, and (2) cultural norms for abbreviation, punctuation, etc.
         ) 

Tue

星期二

See this code run live at IdeOne.com (but only Locale.US works there).

请查看此代码在IdeOne.com上实时运行(但只在Locale)。我们在那里工作)。

java.time

See my example code above, and see the correct Answer for java.time by Przemek.

请参见上面的示例代码,并查看java的正确答案。由Przemek时间。

Ordinal number

if just the day ordinal is desired, how can that be retrieved?

如果只是想要一天的序数,那怎么能取回呢?

For ordinal number, consider passing around the DayOfWeek enum object instead such as DayOfWeek.TUESDAY. Keep in mind that a DayOfWeek is a smart object, not just a string or mere integer number. Using those enum objects makes your code more self-documenting, ensures valid values, and provides type-safety.

对于序数,可以考虑将周数作为周数,比如周数。请记住,每周的一天是一个聪明的对象,而不仅仅是一个字符串或一个整数。使用这些enum对象可以使代码更加自文档化,确保有效的值,并提供类型安全。

But if you insist, ask DayOfWeek for a number. You get 1-7 for Monday-Sunday per the ISO 8601 standard.

但是如果你坚持的话,可以每周找一天的时间问一个数字。根据ISO 8601标准,您星期一至星期天可获得1-7。

int ordinal = myLocalDate.getDayOfWeek().getValue() ;

Joda-Time

UPDATE: The Joda-Time project is now in maintenance mode. The team advises migrating to the java.time classes. The java.time framework is built into Java 8 (as well as back-ported to Java 6 & 7 and further adapted to Android).

更新:Joda-Time项目现在处于维护模式。团队建议迁移到java。时间类。java。时间框架构建于Java 8(以及向后移植到Java 6 & 7,并进一步适应Android)。

Here is example code using the Joda-Time library version 2.4, as mentioned in the accepted answer by Bozho. Joda-Time is far superior to the java.util.Date/.Calendar classes bundled with Java.

这里是使用Joda-Time库版本2.4的示例代码,如Bozho所接受的答案中所提到的。Joda-Time远远优于java.util.Date/。与Java绑定的日历类。

LocalDate

Joda-Time offers the LocalDate class to represent a date-only without any time-of-day or time zone. Just what this Question calls for. The old java.util.Date/.Calendar classes bundled with Java lack this concept.

Joda-Time提供LocalDate类来表示一个没有任何时间或时区的日期。这正是这个问题所要求的。*ava.util.Date /。与Java绑定的日历类缺乏这个概念。

Parse

Parse the string into a date value.

将字符串解析为日期值。

String input = "23/2/2010";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "d/M/yyyy" );
LocalDate localDate = formatter.parseLocalDate( input );

Extract

Extract from the date value the day of week number and name.

从日期值中提取星期数和名称。

int dayOfWeek = localDate.getDayOfWeek(); // Follows ISO 8601 standard, where Monday = 1, Sunday = 7.
Locale locale = Locale.US;  // Locale specifies the human language to use in determining day-of-week name (Tuesday in English versus Mardi in French).
DateTimeFormatter formatterOutput = DateTimeFormat.forPattern( "E" ).withLocale( locale );
String output = formatterOutput.print( localDate ); // 'E' is code for abbreviation of day-of-week name. See Joda-Time doc.
String outputQuébécois = formatterOutput.withLocale( Locale.CANADA_FRENCH ).print( localDate );

Dump

Dump to console.

转储到控制台。

System.out.println( "input: " + input );
System.out.println( "localDate: " + localDate ); // Defaults to ISO 8601 formatted strings.
System.out.println( "dayOfWeek: " + dayOfWeek );
System.out.println( "output: " + output );
System.out.println( "outputQuébécois: " + outputQuébécois );

Run

When run.

运行时。

input: 23/2/2010
localDate: 2010-02-23
dayOfWeek: 2
output: Tue
outputQuébécois: mar.

About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

java。time框架被构建到Java 8以及以后的版本中。这些类取代了麻烦的旧遗留日期时间类(如java.util)。日期,日历,& SimpleDateFormat。

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

现在处于维护模式的Joda-Time项目建议迁移到java。时间类。

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

要了解更多信息,请参阅Oracle教程。和搜索堆栈溢出为许多例子和解释。规范是JSR 310。

Where to obtain the java.time classes?

在哪里获得java。时间类?

  • Java SE 8, Java SE 9, and later
    • Built-in.
    • 内置的。
    • Part of the standard Java API with a bundled implementation.
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9 adds some minor features and fixes.
    • Java 9添加了一些次要的特性和修复。
  • Java SE 8, Java SE 9,以及后来的内置。带有捆绑实现的标准Java API的一部分。Java 9添加了一些次要的特性和修复。
  • Java SE 6 and Java SE 7
    • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
    • 大部分java。时间功能在三个回端移植到Java 6和7。
  • Java SE 6和Java SE 7大部分的Java。时间功能在三个回端移植到Java 6和7。
  • Android
    • The ThreeTenABP project adapts ThreeTen-Backport (mentioned above) for Android specifically.
    • ThreeTenABP项目特别适用于Android。
    • See How to use ThreeTenABP….
    • 看到如何使用ThreeTenABP ....
  • Android的ThreeTenABP项目特别适用于Android的ThreeTen-Backport(上面提到的)。看到如何使用ThreeTenABP ....

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

三个额外的项目扩展了java。时间和额外的类。这个项目是java.time未来可能增加的一个试验场。您可以在这里找到一些有用的课程,如间隔、年周、年季等。

#5


8  

java.time

Using java.time framework built into Java 8 and later.

使用java。Java 8及以后的时间框架。

The DayOfWeek enum can generate a String of the day’s name automatically localized to the human language and cultural norms of a Locale. Specify a TextStyle to indicate you want long form or abbreviated name.

一天的enum可以生成一个日期的字符串,自动定位到语言和语言环境的文化规范。指定一个TextStyle来指示要使用长表单或缩写名。

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

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy");
LocalDate date = LocalDate.parse("23/2/2010", formatter); // LocalDate = 2010-02-23
DayOfWeek dow = date.getDayOfWeek();  // Extracts a `DayOfWeek` enum object.
String output = dow.getDisplayName(TextStyle.SHORT, Locale.US); // String = Tue

#6


5  

Another "fun" way is to use Doomsday algorithm. It's a way longer method but it's also faster if you don't need to create a Calendar object with a given date.

另一个“有趣”的方法是使用末日算法。这是一种更长的方法,但如果不需要创建具有给定日期的日历对象,它也更快。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 *
 * @author alain.janinmanificat
 */
public class Doomsday {

    public static HashMap<Integer, ArrayList<Integer>> anchorDaysMap = new HashMap<>();
    public static HashMap<Integer, Integer> doomsdayDate = new HashMap<>();
    public static String weekdays[] = new DateFormatSymbols(Locale.FRENCH).getWeekdays();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws ParseException, ParseException {

        // Map is fed manually but we can use this to calculate it : http://en.wikipedia.org/wiki/Doomsday_rule#Finding_a_century.27s_anchor_day
        anchorDaysMap.put(Integer.valueOf(0), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1700));
                add(Integer.valueOf(2100));
                add(Integer.valueOf(2500));
            }
        });

        anchorDaysMap.put(Integer.valueOf(2), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1600));
                add(Integer.valueOf(2000));
                add(Integer.valueOf(2400));
            }
        });

        anchorDaysMap.put(Integer.valueOf(3), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1500));
                add(Integer.valueOf(1900));
                add(Integer.valueOf(2300));
            }
        });

        anchorDaysMap.put(Integer.valueOf(5), new ArrayList<Integer>() {
            {
                add(Integer.valueOf(1800));
                add(Integer.valueOf(2200));
                add(Integer.valueOf(2600));
            }
        });

        //Some reference date that always land on Doomsday
        doomsdayDate.put(Integer.valueOf(1), Integer.valueOf(3));
        doomsdayDate.put(Integer.valueOf(2), Integer.valueOf(14));
        doomsdayDate.put(Integer.valueOf(3), Integer.valueOf(14));
        doomsdayDate.put(Integer.valueOf(4), Integer.valueOf(4));
        doomsdayDate.put(Integer.valueOf(5), Integer.valueOf(9));
        doomsdayDate.put(Integer.valueOf(6), Integer.valueOf(6));
        doomsdayDate.put(Integer.valueOf(7), Integer.valueOf(4));
        doomsdayDate.put(Integer.valueOf(8), Integer.valueOf(8));
        doomsdayDate.put(Integer.valueOf(9), Integer.valueOf(5));
        doomsdayDate.put(Integer.valueOf(10), Integer.valueOf(10));
        doomsdayDate.put(Integer.valueOf(11), Integer.valueOf(7));
        doomsdayDate.put(Integer.valueOf(12), Integer.valueOf(12));

        long time = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {

            //Get a random date
            int year = 1583 + new Random().nextInt(500);
            int month = 1 + new Random().nextInt(12);
            int day = 1 + new Random().nextInt(7);

            //Get anchor day and DoomsDay for current date
            int twoDigitsYear = (year % 100);
            int century = year - twoDigitsYear;
            int adForCentury = getADCentury(century);
            int dd = ((int) twoDigitsYear / 12) + twoDigitsYear % 12 + (int) ((twoDigitsYear % 12) / 4);

            //Get the gap between current date and a reference DoomsDay date
            int referenceDay = doomsdayDate.get(month);
            int gap = (day - referenceDay) % 7;

            int result = (gap + adForCentury + dd) % 7;

            if(result<0){
                result*=-1;
            }
            String dayDate= weekdays[(result + 1) % 8];
            //System.out.println("day:" + dayDate);
        }
        System.out.println("time (ms) : " + (System.currentTimeMillis() - time)); //time (ms) : 80

         time = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            Calendar c = Calendar.getInstance();
            //I should have used random date here too, but it's already slower this way
            c.setTime(new SimpleDateFormat("dd/MM/yyyy").parse("12/04/1861"));
//            System.out.println(new SimpleDateFormat("EE").format(c.getTime()));
            int result2 = c.get(Calendar.DAY_OF_WEEK);
//            System.out.println("day idx :"+ result2);
        }
        System.out.println("time (ms) : " + (System.currentTimeMillis() - time)); //time (ms) : 884
    }

    public static int getADCentury(int century) {
        for (Map.Entry<Integer, ArrayList<Integer>> entry : anchorDaysMap.entrySet()) {
            if (entry.getValue().contains(Integer.valueOf(century))) {
                return entry.getKey();
            }
        }
        return 0;
    }
}

#7


4  

public class TryDateFormats {
    public static void main(String[] args) throws ParseException {
        String month = "08";
        String day = "05";
        String year = "2015";
        String inputDateStr = String.format("%s/%s/%s", day, month, year);
        Date inputDate = new SimpleDateFormat("dd/MM/yyyy").parse(inputDateStr);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(inputDate);
        String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US).toUpperCase();
        System.out.println(dayOfWeek);
    }
}

#8


4  

...
import java.time.LocalDate;
...
//String month = in.next();
int mm = in.nextInt();
//String day = in.next();
int dd = in.nextInt();
//String year = in.next();
int yy = in.nextInt();
in.close();
LocalDate dt = LocalDate.of(yy, mm, dd);
System.out.print(dt.getDayOfWeek());

#9


3  

private String getDay(Date date){

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");
    //System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());                       
    return simpleDateFormat.format(date).toUpperCase();
}

private String getDay(String dateStr){
    //dateStr must be in DD-MM-YYYY Formate
    Date date = null;
    String day=null;

    try {
        date = new SimpleDateFormat("DD-MM-YYYY").parse(dateStr);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");
        //System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());
        day = simpleDateFormat.format(date).toUpperCase();


    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    return day;
}

#10


3  

You can try the following code:

您可以尝试以下代码:

import java.time.*;

public class Test{
   public static void main(String[] args) {
      DayOfWeek dow = LocalDate.of(2010,Month.FEBRUARY,23).getDayOfWeek();
      String s = String.valueOf(dow);
      System.out.println(String.format("%.3s",s));
   }
}

#11


2  

import java.text.SimpleDateFormat;

import java.util.Scanner;

class DayFromDate

{

 public static void main(String args[])

 {

    System.out.println("Enter the date(dd/mm/yyyy):");
    Scanner scan=new Scanner(System.in);
    String Date=scan.nextLine();
    try{
        boolean dateValid=dateValidate(Date);
        if(dateValid==true)
        {
            SimpleDateFormat df = new SimpleDateFormat( "dd/MM/yy" );  
            java.util.Date date = df.parse(Date);   
            df.applyPattern( "EEE" );  
            String day= df.format( date ); 
            if(day.compareTo("Sat")==0|| day.compareTo("Sun")==0)
            {
                System.out.println(day+": Weekend");
            }
            else
            {
                System.out.println(day+": Weekday");
            }
        }
        else
        {
            System.out.println("Invalid Date!!!");
        }
    }
    catch(Exception e)
    {
        System.out.println("Invalid Date Formats!!!");
    }
 }

static public boolean dateValidate(String d)

 {

    String dateArray[]= d.split("/");
    int day=Integer.parseInt(dateArray[0]);
    int month=Integer.parseInt(dateArray[1]);
    int year=Integer.parseInt(dateArray[2]);
    System.out.print(day+"\n"+month+"\n"+year+"\n");
    boolean leapYear=false;

    if((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
    {
         leapYear=true;
    }

    if(year>2099 || year<1900)
        return false;

    if(month<13)
    {
        if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
        {
            if(day>31)
                return false;
        }
        else if(month==4||month==6||month==9||month==11)
        {
            if(day>30)
                return false;
        }
        else if(leapYear==true && month==2)
        {
            if(day>29)
              return false;
        }
        else if(leapYear==false && month==2)
        {
            if(day>28)
              return false;
        }
        return true;    
    }
    else return false;
 }
}

#12


1  

Calendar cal = Calendar.getInstance(desired date);
cal.setTimeInMillis(System.currentTimeMillis());
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);

Get the day value by providing the current time stamp.

通过提供当前时间戳获取日值。

#13


1  

LocalDate date=LocalDate.now();

System.out.println(date.getDayOfWeek());//prints THURSDAY
System.out.println(date.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.US) );  //prints Thu   
java.time.DayOfWeek is a enum which returns the singleton instance for the day-of-week of the weekday of the date.

#14


1  

Can use the following code snippet for input like (day = "08", month = "05", year = "2015" and output will be "WEDNESDAY")

可以使用以下代码片段进行输入(day = "08", month = "05", year = "2015",输出为"WEDNESDAY")

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day));
calendar.set(Calendar.MONTH, (Integer.parseInt(month)-1));
calendar.set(Calendar.YEAR, Integer.parseInt(year));
String dayOfWeek = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US).toUpperCase();

#15


0  

You can use below method to get Day of the Week by passing a specific date,

你可以用下面的方法,通过一个特定的日期来获得一周的一天,

Here for the set method of Calendar class, Tricky part is the index for the month parameter will starts from 0.

这里对于Calendar类的set方法,棘手的部分是月参数的索引将从0开始。

public static String getDay(int day, int month, int year) {

        Calendar cal = Calendar.getInstance();

        if(month==1){
            cal.set(year,0,day);
        }else{
            cal.set(year,month-1,day);
        }

        int dow = cal.get(Calendar.DAY_OF_WEEK);

        switch (dow) {
        case 1:
            return "SUNDAY";
        case 2:
            return "MONDAY";
        case 3:
            return "TUESDAY";
        case 4:
            return "WEDNESDAY";
        case 5:
            return "THURSDAY";
        case 6:
            return "FRIDAY";
        case 7:
            return "SATURDAY";
        default:
            System.out.println("GO To Hell....");
        }

        return null;
    }

#16


0  

Program to find the day of the week by giving user input date month and year using java.util.scanner package.

通过使用java.util提供用户输入日期、月份和年份来找到一周的一天。扫描仪包。

import java.util.Scanner;

public class Calender{
  public static String getDay(String day, String month, String year) {

    int ym, yp, d, ay, a=0;
    int by = 20;
    int y[]=new int []{6,4,2,0};
    int m[]=new int []{0,3,3,6,1,4,6,2,5,0,3,5};

    String wd[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

    int gd=Integer.parseInt(day);
    int gm=Integer.parseInt(month);
    int gy=Integer.parseInt(year);

    ym=gy%100;
    yp=ym/4;
    ay=gy/100;

    while (ay!=by) {
        by=by+1;
        a=a+1;
        if(a==4) {
            a=0;
        }
    }

    if ((ym%4==0) && (gm==2)){
        d=(gd+m[gm-1]+ym+yp+y[a]-1)%7;
    }
    else
    d = (gd+m[gm-1]+ym+yp+y[a])%7;
    return wd[d];
}

 public static void main(String[] args){

     Scanner in = new Scanner(System.in);

     String day = in.next();
     String month = in.next();
     String year = in.next();

    System.out.println(getDay(day, month, year));
 }
}

#17


0  

One line answer:

一行的回答:

return LocalDate.parse("06/02/2018",DateTimeFormatter.ofPattern("dd/MM/yyyy")).getDayOfWeek().name();

Usage Example:

使用的例子:

public static String getDayOfWeek(String date){
  return LocalDate.parse(date, DateTimeFormatter.ofPattern("dd/MM/yyyy")).getDayOfWeek().name();
}

public static void callerMethod(){
   System.out.println(getDayOfWeek("06/02/2018")); //TUESDAY
}

#18


0  

Calendar class has build-in displayName functionality:

Calendar类具有内建的显示名称功能:

Calendar.getInstance().getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.getDefault()); // Thu   

Calendar.SHORT -> Thu
Calendar.LONG_FORMAT -> Thursday

Available since Java 1.6. See also Oracle documentation

因为Java 1.6。参见甲骨文文档

#19


-1  

Below is the two line of snippet using Java 1.8 Time API for your Requirement.

下面是使用Java 1.8 Time API满足您的需求的两行代码片段。

LocalDate localDate = LocalDate.of(Integer.valueOf(year),Integer.valueOf(month),Integer.valueOf(day));
String dayOfWeek = String.valueOf(localDate.getDayOfWeek());