특정 날짜를 전달하여 요일을 결정하는 방법은 무엇입니까?


188

예를 들어 날짜가 "2010 년 2 월 23 일"(2010 년 2 월 23 일)입니다. 요일을 반환하는 함수에 전달하고 싶습니다 . 어떻게해야합니까?

이 예에서 함수는 String"Tue"를 반환해야합니다 .

또한 하루 서 수만 원하는 경우 어떻게 검색 할 수 있습니까?

답변:


350

예. 정확한 경우에 따라 :

  • 당신은 사용할 수 있습니다 java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
  • 당신이 출력해야하는 경우 Tue:보다는 3 단지 문자열 포맷 대신 달력을 통해가는, (일요일 1부터 시작 색인 요일,가 Calendar.SUNDAY 참조) new SimpleDateFormat("EE").format(date)( EE"요일, 짧은 버전"을 의미 )

  • 입력이 아닌 문자열로 입력 된 경우 구문 분석에 Date사용해야 SimpleDateFormat합니다.new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • joda-time 's DateTime및 전화 dateTime.dayOfWeek()및 / 또는을 사용할 수 있습니다 DateTimeFormat.

  • 편집 : Java 8부터 joda-time 대신 java.time 패키지를 사용할 수 있습니다.


20
요일은 일요일 인 1부터 시작하므로 화요일은 3이 될 것입니다.
Mohammad Banisaeid

13
주의해야 할 사항은 문자열을 구문 분석하지 않고 정수를 사용하여 Calendar 객체에서 날짜를 설정 한 경우 월 번호는 0부터 시작하므로 1 월은 0이고 12 월은 11입니다.
RenniePet

4
@RenniePet : 좋습니다. 또는 Calendar클래스와 같은 상수를 사용할 수 있습니다 . Calendar.SUNDAYCalendar.JANUARY
Mohammad Banisaeid

2
이 답변은 쓰여졌을 때 큰 대답이었습니다. 오늘 당신은 이제 구식이 클래스에 원하는 것 Calendar, Date그리고 DateTimeFormat(너무 Joda 시간)와 자바 (8) 사용 java.time예를 들어, 클래스 YearMonth또는 LocalDate. 이 답변 에서 더 많은 것을보십시오 .
Ole VV

4
참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 자바 8 자바 9 페이지에 내장 된 클래스 오라클 튜토리얼 .
Basil Bourque

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

이 코드를 사용하여 입력 날짜에서 요일 이름을 찾으십시오. 간단하고 잘 테스트되었습니다.


1
이 방법을 사용하는 경우 일 및 월 순서를주의해서 기록하십시오.
Joel Christophel

1
시도 캐치 블록에 넣어야한다고 생각합니다
Shafaet

1
참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 자바 8 자바 9 페이지에 내장 된 클래스 오라클 튜토리얼 .
Basil Bourque

안드로이드 전용 API (26) 이후 LOCALDATE를 구현
야곱 산체스

29

SimpleDateFormat을 사용하십시오 .

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", java.util.Locale.ENGLISH);
Date myDate = sdf.parse("28/12/2013");
sdf.applyPattern("EEE, d MMM yyyy");
String sMyDate = sdf.format(myDate);

결과 : 2013 년 12 월 28 일 토요일

기본 생성자는 "기본" Locale을 사용하므로 특정 패턴이 필요할 때 조심해서 사용하십시오.

public SimpleDateFormat(String pattern) {
    this(pattern, Locale.getDefault(Locale.Category.FORMAT));
}

21

tl; dr

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.
         ) 

이 참조 코드는 IdeOne.com 라이브 실행 (하지만 Locale.US이 작동합니다).

java.time

위의 예제 코드를 참조하고 Przemek올바른 java.time 응답을 참조하십시오 .

서수

요일 서 수가 필요한 경우 어떻게 검색 할 수 있습니까?

서수의 경우 DayOfWeek와 같이 열거 형 객체를 전달하는 것이 좋습니다 DayOfWeek.TUESDAY. a DayOfWeek는 단순한 문자열이나 정수가 아니라 스마트 객체 라는 점을 명심하십시오 . 이러한 열거 형 객체를 사용하면 코드를보다 자체 문서화하고 유효한 값을 보장하며 형식 안전성을 제공 할 수 있습니다.

그러나 당신이 주장한다면 , 번호를 요청하십시오DayOfWeek . ISO 8601 표준에 따라 월요일-일요일에 1-7을 얻습니다 .

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

조다 타임

업데이트 : Joda-Time 프로젝트는 현재 유지 보수 모드입니다. 팀은 java.time 클래스로 마이그레이션하도록 조언합니다. java.time 체계는 자바 (8)에 내장되어있다 (뿐만 아니라 자바 6 및 7을 다시 포팅상기 안드로이드에 적용 ).

다음은 Bozho승인 된 답변에 언급 된대로 Joda-Time 라이브러리 버전 2.4를 사용하는 예제 코드 입니다. Joda-Time은 Java와 번들로 제공되는 java.util.Date/.Calendar 클래스보다 훨씬 우수합니다.

LocalDate

Joda-Time은 LocalDate시간 또는 시간대없이 날짜 만 나타내는 클래스를 제공합니다 . 이 질문이 요구하는 것. Java로 번들로 제공되는 이전 java.util.Date/.Calendar 클래스에는이 개념이 없습니다.

파싱

문자열을 날짜 값으로 구문 분석하십시오.

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

추출물

날짜 값에서 요일 번호와 이름을 추출하십시오.

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

덤프

콘솔로 덤프하십시오.

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

운영

실행할 때.

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

java.time에 대하여

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

java.time 클래스는 어디서 구할 수 있습니까?

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


15

java.time

java.timeJava 8 이상에 내장 된 프레임 워크 사용

열거는 자동으로 인간의 언어와 문화 규범에 국한 하루의 이름의 캐릭터를 생성 할 수 있습니다 . 긴 형식이나 약어 이름을 원한다는 것을 나타내려면 a 를 지정하십시오 .DayOfWeek LocaleTextStyle

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

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

1
이것은 Oreo 및 위의 API에서만 사용할 수 있습니다.
codepeaker

2
@codepeaker 대부분의 java.time 기능은 ThreeTen-Backport 프로젝트 에서 Java 6 & Java 7로 백 포트됩니다 . ThreeTenABP의 이전 Android (<26)에 더 적합합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
Basil Bourque

9

다음 코드를 시도 할 수 있습니다.

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

이 답변은 다음을 사용하여 이전의 두세 가지 답변보다 가치를 어떻게 추가 LocalDate합니까? 게시하기 전에 읽어 보셨습니까?
Basil Bourque 2016 년

1
이것은 좋은 답변이며 이전의 답변과는 다릅니다. LocalDate.of () API를 사용하여 날짜를 생성하며 대부분의 다른 답변보다 훨씬 짧습니다 (때로는 짧은 답변이 긴 것보다 낫습니다).
Alexey

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

좋은 해결책, 나는이 유형의 해결책을 정확하게 발견하고 있었고, 내 문제를 해결하는 필수 라인. String dayOfWeek = calendar.getDisplayName (Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US) .toUpperCase ();
Muhammad Azam

9

들어 나중에 자바 8 , LOCALDATE이 바람직하다

import java.time.LocalDate;

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

    LocalDate localDate = LocalDate.of(year, month, day);

    java.time.DayOfWeek dayOfWeek = localDate.getDayOfWeek();
    System.out.println(dayOfWeek);

    return dayOfWeek.toString();
}

참고 : 입력이 문자열 / 사용자 정의 인 경우 int 로 구문 분석해야합니다 .


6
...
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());

5

또 다른 "재미있는"방법은 Doomsday 알고리즘 을 사용 하는 것 입니다. 방법이 길지만 주어진 날짜로 Calendar 객체를 만들 필요가 없으면 더 빠릅니다.

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

5

(일 = "08", 월 = "05", 년 = "2015"와 같은 입력에 다음 코드 스 니펫을 사용할 수 있으며 출력은 "수요일"입니다)

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

1
이 답변은 현대의 java.time 클래스로 대체 된 번거로운 구식 날짜 시간을 사용하여 잘못 권고됩니다.
Basil Bourque

1
이것은 Hackerrank에 대한 질문입니다.
Prathamesh 더 많은

5

한 줄 답변 :

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

사용 예 :

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
}

내가 단지 (TextStyle.FULL, Locale.US)하는 getDisplayName와 .name을 ()를 대체하기 위해 필요한 일
가스통 Saillén

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

2
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.

@Ayarnush 지난 달에 답변 한 Przemek의 답변 이외 가치는 어떻게 됩니까?
Basil Bourque

2

hackerrank Java 날짜 및 시간 에 대한 도전이 있습니다

개인적으로 LocalDate 클래스를 선호합니다.

  1. java.time.LocalDate 가져 오기
  2. "int"형식의 인수 3 개를 사용하는 "of"메소드를 사용하여 localDate를 검색하십시오.
  3. 마지막으로 "getDayOfWeek"메소드를 사용하여 그 날의 이름을 얻으십시오.

이 도전에 대한 비디오가 하나 있습니다.

Java Date and Time Hackerrank 솔루션

나는 그것이 도움이되기를 바랍니다 :)


HackerRank Java 날짜 및 시간으로 여기에 와서 해당 Calendar클래스 를 사용하려는 경우 setCalendar 의 메소드는 0에서 시작하는 데 몇 개월이 걸립니다 0 for January. 감사합니다!
Sagar Devkota

2

최신 내장 방법을 사용하지 않고 OP가 요청한 것과 정확히 다른 방법으로 추가 :

public static String getDay(String inputDate) {
    String dayOfWeek = null;
    String[] days = new String[]{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};

    try {
        SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy");
        Date dt1 = format1.parse(inputDate);
        dayOfWeek = days[dt1.getDay() - 1];
    } catch(Exception e) {
        System.out.println(e);
    }

    return dayOfWeek;
}

1
이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Alex Riabov

1
이것은 여러 가지 방법으로 낙담 한 방법입니다. 코드를 컴파일 할 수 없습니다. 오래되고 불완전하게 설계된 클래스 SimpleDateFormat와를 사용해서는 안됩니다 Date. 특히 더 이상 사용되지 않는 getDay방법을 사용해서는 안되며 신뢰할 수 없습니다. 그리고 당신은 사용하지 말아야합니다 if- else우리가이 무엇인지, 7 개 값 사이에서 선택을 위해 switch위해, 또는 당신은 배열을 사용할 수 있습니다. 모든 코드에서 필요한 것보다 길고 복잡합니다.
Ole VV

1
그리고 직접 제공하지 않고 내장 월 약어를 사용하십시오. 더 간단하고 오류 발생 가능성이 적습니다.
Ole VV

1
여기서 사용 된 귀찮은 클래스는 몇 년 전에 java.time 클래스 로 대체되었습니다 . 2018 년에 사용을 제안하는 것은 좋지 않은 조언입니다.
Basil Bourque

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

2

java.util.scanner패키지를 사용하여 사용자 입력 날짜 월과 연도를 제공하여 요일을 찾는 프로그램 :

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

참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 자바 8 자바 9 페이지에 내장 된 클래스 오라클 튜토리얼 .
Basil Bourque

@ 데이브 읽기 정말 좋은가요? if ((ym%4==0) && (gm==2)){ d=(gd+m[gm-1]+ym+yp+y[a]-1)%7;
Pochmurnik

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

현재 타임 스탬프를 제공하여 일 값을 가져옵니다.


1
//to get day of any date

import java.util.Scanner; 
import java.util.Calendar; 
import java.util.Date;

public class Show {

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


            String input_date = month+"/"+day+"/"+year;

            Date now = new Date(input_date);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(now);
            int final_day = (calendar.get(Calendar.DAY_OF_WEEK));

            String finalDay[]={"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"};

            System.out.println(finalDay[final_day-1]);

    }

    public static void main(String[] args) { 
            Scanner in = new Scanner(System.in); 
            String month = in.next(); 
        String day = in.next();
            String year = in.next();

            getDay(day, month, year);
    }

}

2
코드를 보완하기 위해 답변에 대한 설명을 추가하는 것이 유용합니다.
ritlew

1

아래 메소드는 7 일을 검색하고 Kotlin의 List Array에서 짧은 일 이름을 반환합니다.하지만 Java 형식으로 다시 포맷하면 Calendar가 짧은 이름을 반환하는 방법에 대한 아이디어를 제공합니다.

private fun getDayDisplayName():List<String>{
        val calendar = Calendar.getInstance()
        val dates= mutableListOf<String>()
        dates.clear()
        val s=   calendar.getDisplayName(DAY_OF_WEEK, SHORT, Locale.US)
        dates.add(s)
        for(i in 0..5){
            calendar.roll( Calendar.DATE, -1)
            dates.add(calendar.getDisplayName(DAY_OF_WEEK, SHORT, Locale.US))
        }
        return dates.toList()
    }

같은 결과를 넣어

I/System.out: Wed
    Tue
    Mon
    Sun
I/System.out: Sat
    Fri
    Thu

1
OP가 Java에 대해 묻는 경우 Java로 응답하는 것이 가장 좋습니다.
mypetlion 2016 년

1
Calendar2019 년에이 클래스 를 사용해야하는 이유는 없습니다 . 제대로 설계되지 않았고 오래되었습니다. 대신 나는 추천 LocalDateDayOfWeek에서 , 현대 자바 날짜와 시간 API를 java.time .
Ole VV

0

아래 방법을 사용하여 특정 날짜를 전달하여 요일을 얻을 수 있습니다.

Calendar 클래스의 set 메소드에서 Tricky 부분은 month 매개 변수의 색인이 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;
    }

3
이 답변은 지금은 레거시 인 끔찍한 오래된 날짜-시간 클래스를 사용하여 잘못 권장됩니다. java.time 클래스로 대체되었습니다. 또한이 코드는 날짜 전용 문제에 날짜 시간 클래스를 어색하게 적용 한 후 시간대의 중요한 문제를 무시합니다. 대신 Przemek의 java.time에 대한 정답을 참조하십시오 .
Basil Bourque

0

달력 클래스에는 내장 displayName 기능이 있습니다.

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

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

Java 1.6부터 사용 가능합니다. Oracle 설명서 도 참조하십시오


0

이것은 제대로 작동합니다 ...

java.time.LocalDate; //package related to time and date

특정 요일을 얻기 위해 내장 메소드 getDayOfWeek ()를 제공합니다.

int t;
Scanner s = new Scanner(System.in);
t = s.nextInt();
s.nextLine();
 while(t-->0) { 
    int d, m, y;
    String ss = s.nextLine();
    String []sss = ss.split(" ");
    d=Integer.parseInt(sss[0]);
    m = Integer.parseInt(sss[1]);
    y = Integer.parseInt(sss[2]);

    LocalDate l = LocalDate.of(y, m, d); //method to get the localdate instance
    System.out.println(l.getDayOfWeek()); //this returns the enum DayOfWeek

enum의 값을 l.getDayOfWeek()문자열에 할당하려면 name()enum 객체의 값을 반환하는 Enum이라는 메서드를 사용할 수 있습니다 .


2
설명과 코드 스 니펫이 포함되어 있으면 스택 오버플로에 대한 답변이 더 좋습니다.
바질 부르 케

@David, 나는 나의 편집과 당신의 차이점을 찾고 있었는데 그것을 찾을 수 없습니다. 정보를 편집하는 방법을 알면 좋을 것입니다.
Pochmurnik 2014 년

@OrdinaryDraft listHolidays.add(LocalDate.of(year, 1, 1));답변 에 a 를 추가했습니다 . 답변을 향상 시키려면 자신의 답변을 추가해야합니다. 도움이
David

예, 나중에 버전과 비교하기 위해 편집 내용을 확인했습니다. 실수로 그 줄을 복사 한 것 같습니다.
Pochmurnik 2014 년

-3

다음은 요구 사항에 Java 1.8 Time API를 사용하는 두 줄의 스 니펫입니다.

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

2
여기에 표시된 접근 방식은 이미 오래 전에 게시 된 4 가지 이상의 정답에 이미 포함되어 있습니다. 이 복제본으로 추가 된 값이 없습니다.
Basil Bourque
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.