Як визначити день тижня шляхом проходження конкретної дати?


188

Наприклад, у мене дата: "23.02.2010" (23 лютого 2010 р.). Я хочу передати його функції, яка б повернула день тижня . Як я можу це зробити?

У цьому прикладі функція повинна повертати String"Вт".

Крім того, якщо потрібен лише порядковий день, як це можна отримати?

Відповіді:


350

Так. Залежно від вашого конкретного випадку:

  • Ви можете використовувати java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
  • якщо вам потрібен результат, Tueа не 3 (Дні тижня індексуються, починаючи з 1 на неділю, див. Календар.СУНДА), замість того, щоб переглядати календар, просто переформатуйте рядок: new SimpleDateFormat("EE").format(date)( EEмається на увазі "день тижня, коротка версія" )

  • якщо у вас є вхід як рядок, а не Date, вам слід використовувати його SimpleDateFormatдля розбору:new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • Ви можете використовувати joda-time DateTimeта дзвінок dateTime.dayOfWeek()та / або DateTimeFormat.

  • редагувати: з Java 8 тепер ви можете використовувати пакет java.time замість joda-часу


20
Дні тижня починаються з 1, яка є неділею, тому я думаю, що в
четвер

13
Іншими речами, на які слід бути обережними, якщо ви встановлюєте дату в об’єкті календаря за допомогою цілих чисел (не за допомогою розбору рядка), то майте на увазі, що число місяця є нульовим, тому січень - 0, а грудень - 11.
RenniePet

4
@RenniePet: Хороший. Також ви можете використовувати константи в Calendarкласі, наприклад, Calendar.SUNDAYабо Calendar.JANUARY.
Мохаммед Банісейд

2
Ця відповідь була чудовою відповіддю, коли вона була написана. Сьогодні ви захочете до застарілих класів Calendar, Dateа також DateTimeFormat(і часу Joda) і використовувати java.timeкласи Java 8 , наприклад YearMonthабо LocalDate. Детальніше дивіться у цій відповіді .
Оле ВВ

4
FYI, тривожні старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , замінені класами java.time, вбудованими в Java 8 та Java 9. Див. Підручник від Oracle .
Василь Бурк

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
Якщо ви використовуєте цей метод, уважно відзначте порядок днів і місяців.
Джоель Крістофель

1
Я думаю, вам потрібно поставити його у блок
пробного

1
FYI, тривожні старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , замінені класами java.time, вбудованими в Java 8 та Java 9. Див. Підручник від Oracle .
Василь Бурк

Android впроваджує LocalDate лише після API 26
Jacob Sánchez

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

Результат: Сб, 28 грудня 2013 р

Конструктор за замовчуванням займає " Locale " за замовчуванням , тому будьте обережні, використовуючи його, коли вам потрібен певний шаблон.

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

21

тл; д-р

Використання 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

Дивіться мій приклад коду вище та дивіться правильну відповідь для java.time від Przemek .

Порядковий номер

якщо потрібен лише порядковий день, як це можна отримати?

Для порядкового числа розглянемо проходження навколо DayOfWeekоб'єкта enum замість такого, як DayOfWeek.TUESDAY. Майте на увазі, що a DayOfWeek- це розумний об’єкт, а не просто рядок або просто ціле число. Використання цих об'єктів enum робить ваш код більш самодокументованим, забезпечує дійсні значення та забезпечує безпеку типу .

Але якщо ви наполягаєте, попросіть DayOfWeekномер . Ви отримуєте 1-7 за понеділок-неділю за стандартом ISO 8601 .

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

Joda-Time

ОНОВЛЕННЯ: Проект Joda-Time зараз знаходиться в режимі обслуговування. Команда радить перейти на заняття java.time. Рамка java.time вбудована в Java 8 (а також підтримується назад до Java 6 і 7 і надалі адаптується до Android ).

Ось приклад коду з використанням бібліотеки Joda-Time версії 2.4, як згадується у прийнятій відповіді Божо . Joda-Time набагато перевершує класи java.util.Date/.Calendar в комплекті з Java.

LocalDate

Joda-Time пропонує LocalDateкласу представляти лише дату без будь-якого часу дня або часового поясу. Тільки до чого закликає це питання. У старих класах java.util.Date/.Calendar у комплекті з Java відсутня ця концепція.

Розбираємо

Розбираємо рядок на значення дати.

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 каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .

Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .

Де отримати класи java.time?

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є доказом можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


15

java.time

Використання java.timeфреймворку, вбудованого в Java 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 та вище apis.
спікер кодексу

2
@codepeaker Більшість функцій java.time повертається до Java 6 та Java 7 у проекті ThreeTen-Backport . Крім того, адаптований до попереднього Android (<26) у ThreeTenABP . Див. Як користуватися ThreeTenABP… .
Василь Бурк

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? Чи читали ви їх перед публікацією?
Василь Бурк

1
Це хороша відповідь, і вона відрізняється від усіх попередніх. Він використовує API LocalDate.of () для побудови дати, і він набагато коротший, ніж більшість інших відповідей (іноді коротка відповідь краще, ніж довгий) ...
Олексій

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 ();
Мухаммед Азам

9

Для Java 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();
}

Примітка: якщо для введення визначено String / User, слід розібрати його на 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 . Це набагато довший метод, але він також швидший, якщо вам не потрібно створювати об’єкт Календар із заданою датою.

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

Можна використовувати наступний фрагмент коду для введення типу (day = "08", month = "05", year = "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.
Василь Бурк

1
Це питання, задане Хакерранком.
Пратамеш Більше

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
}

Це спрацювало, мені просто потрібно було замінити .name () на getDisplayName (TextStyle.FULL, Locale.US)
Gastón 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, опублікований минулого місяця?
Василь Бурк

2

Перед викликом є ​​виклик дати та часу Java

особисто я віддаю перевагу класу LocalDate.

  1. Імпорт java.time.LocalDate
  2. Отримайте localDate за допомогою методу "of", який бере 3 аргументи у форматі "int".
  3. нарешті, знайдіть назву цього дня, використовуючи метод "getDayOfWeek".

На цей виклик є одне відео.

Рішення про Hackerrank для дати та часу Java

Сподіваюся, це допоможе :)


Якщо будь-який інший приходить сюди за HackerRank Java Дата і час і хочуть використовувати цей Calendarклас, будь ласка, зверніть увагу, що setметод в Календарі займає місяці, починаючи з 0. тобто 0 for January. Дякую!
Сагар Девкота

2

Додавання іншого способу зробити це саме так, як вимагала ОП, не використовуючи новітні вбудовані методи:

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
Хоча цей код може відповісти на питання, надаючи додатковий контекст стосовно того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
Олексій Рябов

1
Це більш ніж одним способом відсторонено це робити. Ваш код неможливо скомпілювати. Не слід використовувати давно застарілі та погано розроблені класи SimpleDateFormatта Date. Зокрема, ви не повинні використовувати застарілий getDayметод, це не є надійним. І ви не повинні використовувати if- elseдля вибору серед 7 значень це те, що ми маємо switch, або ви можете використовувати масив. Загалом ваш код є і довшим, і складнішим, ніж потрібно.
Оле ВВ

1
І використовуйте вбудовані місячні абревіатури, а не надаючи свої. Простіший і менш схильний до помилок.
Оле ВВ

1
Використовувані тут клопітні класи були витіснені роками тому класами java.time . Запропонувати їх використання у 2018 році - це погана порада.
Василь Бурк

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

FYI, тривожні старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , замінені класами java.time, вбудованими в Java 8 та Java 9. Див. Підручник від Oracle .
Василь Бурк

@Dave це справді приємно читати? if ((ym%4==0) && (gm==2)){ d=(gd+m[gm-1]+ym+yp+y[a]-1)%7;
Почмурник

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

метод нижче отримує сім днів і повертає коротку назву днів у List Array у Котліні, однак, ви можете просто переформатувати потім у форматі Java, лише представляючи уявлення про те, як Календар може повернути коротке ім'я

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
Якщо ОП запитує про Java, то найкраще буде відповісти на Java.
mypetlion

1
Немає жодних причин, чому ми б хотіли використовувати Calendarклас у 2019 році. Він погано розроблений і давно застарів. Натомість я рекомендую LocalDateі DayOfWeekз java.time - сучасний API дати та часу Java .
Оле ВВ

0

Ви можете скористатися методом нижче, щоб отримати день тижня, пройшовши певну дату,

Тут для встановленого методу класу Календар, Tricky частина - індекс для місячного параметра починається від 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. Крім того, цей код ігнорує вирішальну проблему часового поясу після незручного застосування класу часу-дати до проблеми, що стосується лише дати. Натомість див. Правильний відповідь для java.time від Przemek .
Василь Бурк

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()рядку, ви, ймовірно, могли використовувати метод Enum, який називається, name()який повертає значення об'єкта enum.


2
Відповіді на переповнення стека краще, якщо вони містять пояснення, а також фрагмент коду.
Василь Бурк

@David, я шукав різниці в моєму редагуванні і вашому, я не можу його знайти. Було б добре отримати інформацію, як редагувати.
Почмурник

@OrdinaryDraft Ви додали відповідь listHolidays.add(LocalDate.of(year, 1, 1));на відповідь. Якщо ви хочете вдосконалити відповідь, вам слід додати свою власну. Сподіваюсь, що це допомагає
Девід

Так, пізніше я перевірив свою редагування, щоб порівняти її з вашою версією. Здається, я скопіював цей рядок помилково.
Почмурник

-3

Нижче наведено два рядки фрагмента, використовуючи API Java 1.8 Time for your Require.

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

2
Показаний тут підхід був висвітлений у щонайменше 4 хороших відповідях, опублікованих давно. Я не бачу доданої вартості цього дубліката.
Василь Бурк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.