Wie kann man den Wochentag anhand eines bestimmten Datums bestimmen?


187

Zum Beispiel habe ich das Datum: "23/2/2010" (23. Februar 2010). Ich möchte es an eine Funktion übergeben, die den Wochentag zurückgibt . Wie kann ich das machen?

In diesem Beispiel sollte die Funktion String"Di" zurückgeben.

Wenn nur die Ordnungszahl des Tages gewünscht wird, wie kann diese abgerufen werden?

Antworten:


349

Ja. Abhängig von Ihrem genauen Fall:

  • Sie können verwenden java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
  • Wenn die Ausgabe nicht Tue3 sein soll (Wochentage werden ab 1 für Sonntag indiziert, siehe Calendar.SUNDAY), formatieren Sie statt eines Kalenders einfach die Zeichenfolge neu: new SimpleDateFormat("EE").format(date)( EEbedeutet "Wochentag, Kurzversion"). )

  • Wenn Sie Ihre Eingabe nicht als Zeichenfolge, sondern als Zeichenfolge haben, Datesollten Sie SimpleDateFormatsie analysieren:new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • Sie können joda-time's verwenden DateTimeund anrufen dateTime.dayOfWeek()und / oder DateTimeFormat.

  • Bearbeiten: Seit Java 8 können Sie jetzt das Paket java.time anstelle von joda-time verwenden


20
Die Wochentage beginnen bei 1, was Sonntag ist, also denke ich, dass Di 3 sein würde.
Mohammad Banisaeid

13
Wenn Sie das Datum im Kalenderobjekt mithilfe von Ganzzahlen festlegen (nicht durch Parsen einer Zeichenfolge), müssen Sie beachten, dass die
Monatszahl auf

4
@ RenniePet: Gut. Sie können auch Konstanten in der CalendarKlasse verwenden, z. B. Calendar.SUNDAYoder Calendar.JANUARY.
Mohammad Banisaeid

2
Diese Antwort war eine großartige Antwort, als sie geschrieben wurde. Heute werden Sie auf die jetzt veraltet Klassen Calendar, Dateund DateTimeFormat(und Joda Zeit zu) und verwenden Sie die Java 8 java.timeKlassen, zum Beispiel YearMonthoder LocalDate. Weitere Informationen finden Sie in dieser Antwort .
Ole VV

4
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .
Basil Bourque

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

Verwenden Sie diesen Code, um den Tagesnamen anhand eines Eingabedatums zu ermitteln. Einfach und gut getestet.


1
Wenn Sie diese Methode verwenden, beachten Sie sorgfältig die Reihenfolge der Tage und Monate.
Joel Christophel

1
Ich denke, Sie müssen es in einen Versuch fangen Block
Shafaet

1
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .
Basil Bourque

Android implementiert LocalDate erst nach API 26.
Jacob Sánchez

29

Verwenden Sie einfach 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);

Das Ergebnis ist: Sa, 28. Dezember 2013

Der Defaultkonstruktor nimmt „die Voreinstellung“ Locale , so vorsichtig sein , es zu benutzen , wenn Sie ein bestimmtes Muster benötigen.

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

21

tl; dr

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

Di.

Sehen Sie diesen Code live auf IdeOne.com ( Locale.USfunktioniert aber nur dort).

java.time

Siehe meinen Beispielcode oben und die richtige Antwort für java.time von Przemek .

Ordinalzahl

Wenn nur die Ordnungszahl des Tages gewünscht wird, wie kann diese abgerufen werden?

Verwenden Sie für die Ordnungszahl DayOfWeekstattdessen das Enum-Objekt, z DayOfWeek.TUESDAY. Denken Sie daran, dass a DayOfWeekein intelligentes Objekt ist, nicht nur eine Zeichenfolge oder eine bloße Ganzzahl. Durch die Verwendung dieser Enum-Objekte wird Ihr Code selbstdokumentierender , stellt gültige Werte sicher und bietet Typensicherheit .

Aber wenn Sie darauf bestehen, fragen Sie DayOfWeeknach einer Nummer . Sie erhalten 1-7 für Montag bis Sonntag gemäß der Norm ISO 8601 .

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

Joda-Zeit

UPDATE: Das Joda-Time-Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt, auf die Klassen java.time zu migrieren. Das java.time-Framework ist in Java 8 integriert (sowie auf Java 6 und 7 zurückportiert und weiter an Android angepasst ).

Hier ist ein Beispielcode mit der Joda-Time- Bibliothek Version 2.4, wie in der akzeptierten Antwort von Bozho erwähnt . Joda-Time ist den mit Java gebündelten Klassen java.util.Date/.Calendar weit überlegen.

LocalDate

Joda-Time bietet die LocalDate Klasse die nur ein Datum ohne Tageszeit oder Zeitzone darzustellen. Genau das, was diese Frage verlangt. Den alten, mit Java gebündelten Klassen java.util.Date/.Calendar fehlt dieses Konzept.

Analysieren

Analysieren Sie die Zeichenfolge in einen Datumswert.

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

Extrakt

Extrahieren Sie aus dem Datumswert die Wochentagsnummer und den Namen.

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

Zur Konsole werfen.

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

Lauf

Beim Ausführen.

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

Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date, Calendar, & SimpleDateFormat.

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Woher bekomme ich die java.time-Klassen?

Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarter, und mehr .


15

java.time

Verwenden eines java.timein Java 8 und höher integrierten Frameworks.

Die Aufzählung kann eine Zeichenfolge des Tagesnamens generieren, die automatisch in der menschlichen Sprache und den kulturellen Normen von a lokalisiert ist . Geben Sie a an, um anzugeben, dass Sie eine lange Form oder einen abgekürzten Namen wünschen.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
Dies kann nur in Oreo und darüber verwendet werden.
Codepeaker

2
@codepeaker Die meisten Funktionen von java.time werden im ThreeTen-Backport- Projekt auf Java 6 und Java 7 zurückportiert . Weiter angepasst für früheres Android (<26) in ThreeTenABP . Siehe Verwendung von ThreeTenABP… .
Basil Bourque

9

Sie können den folgenden Code ausprobieren:

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

Wie kann diese Antwort einen Mehrwert schaffen, der über den der zwei oder drei vorherigen Antworten hinausgeht LocalDate? Hast du diese vor dem Posten gelesen?
Basil Bourque

1
Dies ist eine gute Antwort und unterscheidet sich von allen vorherigen. Es verwendet die LocalDate.of () API, um das Datum zu erstellen, und es ist viel kürzer als die meisten anderen Antworten (manchmal ist eine kurze Antwort besser als eine lange) ...
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);
    }
}

schöne Lösung, ich fand genau diese Art von Lösung, meine erforderliche Linie, die mein Problem löste. Zeichenfolge dayOfWeek = calendar.getDisplayName (Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US) .toUpperCase ();
Muhammad Azam

8

Für Java 8 oder höher , LOCALDATE ist vorzuziehen ,

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

Hinweis: Wenn die Eingabe String / Benutzerdefiniert ist, sollten Sie sie in int analysieren .


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

Eine andere "lustige" Möglichkeit ist die Verwendung des Doomsday-Algorithmus . Es ist eine viel längere Methode, aber auch schneller, wenn Sie kein Kalenderobjekt mit einem bestimmten Datum erstellen müssen.

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

Kann das folgende Code-Snippet für Eingaben wie (Tag = "08", Monat = "05", Jahr = "2015" und Ausgabe wird "MITTWOCH") verwenden.

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
Diese Antwort ist schlecht beraten, da lästige alte Datums- und Uhrzeitangaben verwendet werden, die jetzt veraltet sind und durch die modernen java.time-Klassen ersetzt werden.
Basil Bourque

1
Dies ist die Frage, die auf Hackerrank gestellt wird.
Prathamesh More

5

Einzeilige Antwort:

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

Anwendungsbeispiel:

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
}

Es hat funktioniert, ich musste nur .name () durch getDisplayName (TextStyle.FULL, Locale.US) ersetzen
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 Wie fügt Ihre Antwort einen Wert hinzu, der über die Antwort von Przemek vom letzten Monat hinausgeht ?
Basil Bourque

2

Es gibt eine Herausforderung für das Datum und die Uhrzeit von Hackerrank Java

Ich persönlich bevorzuge die LocalDate-Klasse.

  1. Importieren Sie java.time.LocalDate
  2. Rufen Sie localDate mit der Methode "of" ab, die 3 Argumente im Format "int" verwendet.
  3. Holen Sie sich schließlich den Namen dieses Tages mit der Methode "getDayOfWeek".

Es gibt ein Video zu dieser Herausforderung.

Java-Hackerrank-Lösung für Datum und Uhrzeit

Ich hoffe es wird helfen :)


Wenn andere für HackerRank Java Datum und Uhrzeit hierher kommen und diese CalendarKlasse verwenden möchten , beachten Sie bitte, dass die setMethode im Kalender Monate ab 0 dauert 0 for January. Danke dir!
Sagar Devkota

2

Hinzufügen einer anderen Möglichkeit, genau das zu tun, was das OP verlangt, ohne die neuesten integrierten Methoden zu verwenden:

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
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Alex Riabov

1
Dies ist in mehr als einer Hinsicht die entmutigte Art, dies zu tun. Ihr Code kann nicht kompiliert werden. Sie sollten nicht die lange veralteten und schlecht gestalteten Klassen SimpleDateFormatund verwenden Date. Insbesondere sollten Sie die veraltete getDayMethode nicht verwenden , sie ist nicht zuverlässig. Und Sie sollten nicht verwenden if- elsefür die Auswahl von 7 Werten, die wir haben switch, oder Sie können ein Array verwenden. Alles in allem ist Ihr Code sowohl länger als auch komplizierter als nötig.
Ole VV

1
Verwenden Sie die integrierten Monatsabkürzungen, anstatt Ihre eigenen anzugeben. Einfacher und weniger fehleranfällig.
Ole VV

1
Die hier verwendeten problematischen Klassen wurden vor Jahren durch die java.time- Klassen ersetzt. Die Verwendung im Jahr 2018 vorzuschlagen, ist ein schlechter Rat.
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

Programm zum Ermitteln des Wochentags durch Angabe des Benutzereingabedatums Monat und Jahr mit dem java.util.scannerPaket:

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

Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 & Java 9. Siehe Tutorial von Oracle .
Basil Bourque

@ Dave ist das wirklich schön zu lesen? 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);

Erhalten Sie den Tageswert, indem Sie den aktuellen Zeitstempel angeben.


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
Es wäre nützlich, eine Erklärung der Antwort hinzuzufügen, um den Code zu ergänzen.
Ritlew

1

Die folgende Methode ruft sieben Tage ab und gibt den Kurznamen der Tage im List Array in Kotlin zurück. Sie können ihn jedoch einfach im Java-Format neu formatieren und nur die Idee präsentieren, wie der Kalender den Kurznamen zurückgeben kann

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

Ergebnisse wie

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

1
Wenn OP nach Java fragt, ist es am besten, mit Java zu antworten.
Mypetlion

1
Es gibt keinen Grund, warum wir die CalendarKlasse 2019 verwenden sollten. Sie ist schlecht gestaltet und längst veraltet. Stattdessen empfehle ich LocalDateund DayOfWeekvon java.time die moderne Java-API für Datum und Uhrzeit .
Ole VV

0

Sie können die folgende Methode verwenden, um den Wochentag zu erhalten, indem Sie ein bestimmtes Datum übergeben.

Hier für die festgelegte Methode der Kalenderklasse ist der schwierige Teil der Index für den Monatsparameter, der bei 0 beginnt .

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
Diese Antwort ist schlecht beraten, da schreckliche alte Datums- / Uhrzeitklassen verwendet werden, die jetzt Legacy sind und durch die Klassen java.time ersetzt werden. Außerdem ignoriert dieser Code das entscheidende Problem der Zeitzone, nachdem eine Datums- / Uhrzeitklasse umständlich auf ein Nur-Datum-Problem angewendet wurde. Lesen Sie stattdessen die richtige Antwort für java.time von Przemek .
Basil Bourque

0

Die Kalenderklasse verfügt über eine integrierte displayName-Funktionalität:

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

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

Verfügbar seit Java 1.6. Siehe auch Oracle-Dokumentation


0

Das funktioniert richtig ...

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

Es bietet die integrierte Methode getDayOfWeek (), um den Tag einer bestimmten Woche abzurufen:

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

Um den Wert von enum l.getDayOfWeek()einer Zeichenfolge zuzuweisen , können Sie wahrscheinlich die aufgerufene Methode von Enum verwenden name(), die den Wert von enum object zurückgibt.


2
Antworten zum Stapelüberlauf sind besser, wenn sie eine Erklärung sowie einen Code-Ausschnitt enthalten.
Basil Bourque

@ David, ich habe nach Unterschieden in meiner und Ihrer Bearbeitung gesucht, ich kann sie nicht finden. Wäre schön, die Infos zum Bearbeiten zu bekommen.
Pochmurnik

@OrdinaryDraft Sie haben listHolidays.add(LocalDate.of(year, 1, 1));der Antwort ein hinzugefügt . Wenn Sie die Antwort verbessern möchten, sollten Sie Ihre eigene hinzufügen. Hoffe das hilft
David

Ja, ich habe später meine Bearbeitung überprüft, um sie mit Ihrer Version zu vergleichen. Es scheint, dass ich diese Zeile versehentlich kopiert habe.
Pochmurnik

-3

Im Folgenden finden Sie zwei Snippet-Zeilen, die die Java 1.8-Zeit-API für Ihre Anforderungen verwenden.

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

2
Der hier gezeigte Ansatz wurde bereits in mindestens 4 guten Antworten behandelt, die vor langer Zeit veröffentlicht wurden. Ich sehe keinen Mehrwert durch dieses Duplikat.
Basil Bourque
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.