Come determinare il giorno della settimana passando una data specifica?


188

Per esempio ho la data: "23/2/2010" (23 febbraio 2010). Voglio passarlo a una funzione che restituirebbe il giorno della settimana . Come posso fare questo?

In questo esempio, la funzione dovrebbe restituire String"Mar".

Inoltre, se si desidera solo il giorno ordinale, come può essere recuperato?

Risposte:


350

Sì. A seconda del caso esatto:

  • Puoi usare java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
  • se hai bisogno che l'output sia Tueanziché 3 (i giorni della settimana sono indicizzati a partire da 1 per domenica, vedi Calendar.SUNDAY), invece di passare attraverso un calendario, riformatta semplicemente la stringa: new SimpleDateFormat("EE").format(date)(che EEsignifica "giorno della settimana, versione corta" )

  • se hai il tuo input come stringa, piuttosto che Date, dovresti usare SimpleDateFormatper analizzarlo:new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • puoi usare joda-time DateTimee call dateTime.dayOfWeek()e / o DateTimeFormat.

  • modifica: da Java 8 ora puoi usare il pacchetto java.time invece di joda-time


20
I giorni della settimana iniziano da 1, che è domenica, quindi penso che martedì sarebbe 3.
Mohammad Banisaeid,

13
In altre cose da fare attenzione, se si imposta la data nell'oggetto Calendario utilizzando numeri interi (non tramite l'analisi di una stringa), tenere presente che il numero del mese è basato su zero, quindi gennaio è 0 e dicembre è 11.
RenniePet

4
@RenniePet: buono. Inoltre puoi usare le costanti in Calendarclasse, come Calendar.SUNDAYo Calendar.JANUARY.
Mohammad Banisaeid,

2
Questa risposta è stata un'ottima risposta quando è stata scritta. Oggi si vorrà classi ormai superata Calendar, Datee DateTimeFormat(e il tempo Joda troppo) e utilizzare le Java 8 java.timeclassi, per esempio YearMontho LocalDate. Vedi di più in questa risposta .
Ole VV,

4
Cordiali saluti, le vecchie e problematiche classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e Java 9. Vedi Tutorial di Oracle .
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);

Usa questo codice per trovare il nome del giorno da una data di input. Semplice e ben testato.


1
Se si utilizza questo metodo, prendere attentamente nota dell'ordine di giorni e mesi.
Joel Christophel,

1
Penso che tu debba metterlo in un blocco catch try
Shafaet

1
Cordiali saluti, le vecchie e problematiche classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e Java 9. Vedi Tutorial di Oracle .
Basil Bourque,

Android implementa LocalDate solo dopo l'API 26.
Jacob Sánchez il

29

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

Il risultato è: sab, 28 dic 2013

Il costruttore predefinito sta prendendo le impostazioni internazionali "predefinite" , quindi fai attenzione quando lo usi quando hai bisogno di un modello specifico.

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

21

tl; dr

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

mar

Vedi questo codice eseguito dal vivo su IdeOne.com (ma Locale.USfunziona solo lì).

java.time

Vedi il mio codice di esempio sopra e vedi la risposta corretta per java.time di Przemek .

Numero ordinale

se si desidera solo il giorno ordinale, come può essere recuperato?

Per il numero ordinale, considera di passare intorno DayOfWeekall'oggetto enum invece come DayOfWeek.TUESDAY. Tieni presente che a DayOfWeekè un oggetto intelligente, non solo una stringa o un semplice numero intero. L'uso di questi oggetti enum rende il tuo codice più autocontrollo, garantisce valori validi e garantisce la sicurezza dei tipi .

Ma se insisti, chiedi DayOfWeekun numero . Ottieni 1-7 per lunedì-domenica secondo lo standard ISO 8601 .

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

Joda-Time

AGGIORNAMENTO: il progetto Joda-Time è ora in modalità manutenzione. Il team consiglia di migrare alle classi java.time. Il framework java.time è integrato in Java 8 (così come il back-port su Java 6 e 7 e ulteriormente adattato ad Android ).

Ecco un codice di esempio che utilizza la libreria Joda-Time versione 2.4, come indicato nella risposta accettata da Bozho . Joda-Time è di gran lunga superiore alle classi java.util.Date/.Calendar in bundle con Java.

LocalDate

Joda-Time offre alla LocalDateclasse di rappresentare solo una data senza alcun orario o fuso orario. Proprio quello che richiede questa domanda. Le vecchie classi java.util.Date/.Calendar in bundle con Java non hanno questo concetto.

Parse

Analizza la stringa in un valore di data.

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

Estratto

Estrai dal valore della data il numero e il nome del giorno della settimana.

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

cumulo di rifiuti

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

Correre

Quando eseguito.

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

Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, e SimpleDateFormat.

Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Dove ottenere le classi java.time?

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek,YearQuarter e altro .


15

java.time

utilizzando java.time framework integrato in Java 8 e versioni successive.

L' enum può generare una stringa del nome del giorno automaticamente localizzata nel linguaggio umano e nelle norme culturali di a . Specificare a per indicare che si desidera una forma lunga o un nome abbreviato.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
Questo può essere usato solo in Oreo e sopra le API.
codepeaker

2
@codepeaker La maggior parte della funzionalità java.time è trasferita su Java 6 e Java 7 nel progetto ThreeTen-Backport . Ulteriore adattamento per Android precedente (<26) in ThreeTenABP . Vedi Come usare ThreeTenABP… .
Basil Bourque,

9

Puoi provare il seguente codice:

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

In che modo questa risposta aggiunge valore oltre a quella delle due o tre risposte precedenti usando LocalDate? Hai letto quelli prima di pubblicare?
Basil Bourque,

1
Questa è una buona risposta, ed è diversa da tutte le precedenti. Utilizza l'API LocalDate.of () per costruire la data ed è molto più breve della maggior parte delle altre risposte (a volte la risposta breve è meglio della lunga) ...
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);
    }
}

bella soluzione, stavo trovando esattamente questo tipo di soluzione, la mia linea richiesta che ha risolto il mio problema. Stringa dayOfWeek = calendar.getDisplayName (Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US) .toUpperCase ();
Muhammad Azam,

9

Per Java 8 o versioni successive , è preferibile 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();
}

Nota: se l'input è definito da String / User, è necessario analizzarlo in 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

Un altro modo "divertente" è usare l' algoritmo Doomsday . È un metodo molto più lungo, ma è anche più veloce se non è necessario creare un oggetto Calendar con una determinata data.

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

Può utilizzare il seguente frammento di codice per input come (day = "08", month = "05", year = "2015" e l'output sarà "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();

1
Questa risposta è sconsiderata, con l'uso di una vecchia data problematica che ora è ereditata, soppiantata dalle moderne classi java.time.
Basil Bourque,

1
Questa è la domanda posta su Hackerrank.
Prathamesh Altro,

5

Una riga di risposta:

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

Esempio di utilizzo:

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
}

Funzionava, dovevo solo sostituire .name () con 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 In che modo la tua risposta aggiunge valore oltre alla risposta di Przemek pubblicata il mese scorso?
Basil Bourque,

2

C'è una sfida su hackerrank Java Date and Time

personalmente preferisco la classe LocalDate.

  1. Importa java.time.LocalDate
  2. Recupera localDate usando il metodo "of" che accetta 3 argomenti nel formato "int".
  3. infine, ottieni il nome di quel giorno usando il metodo "getDayOfWeek".

C'è un video su questa sfida.

Soluzione Hackerrank di data e ora di Java

Spero che questo possa aiutare :)


Se qualsiasi altro venire qui per HackerRank Java data e ora e si desidera utilizzare tale Calendarclasse, si ricorda che il setmetodo del calendario prende mesi a partire da 0. cioè 0 for January. Grazie!
Sagar Devkota,

2

Aggiungendo un altro modo di farlo esattamente come richiesto dall'OP, senza utilizzare gli ultimi metodi integrati:

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
Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo al perché e / o al modo in cui questo codice risponde alla domanda migliora il suo valore a lungo termine.
Alex Riabov,

1
Questo è in più di un modo il modo scoraggiato di farlo. Il tuo codice non può essere compilato. Non dovresti usare le classi obsolete e mal progettate SimpleDateFormate Date. In particolare non dovresti usare il getDaymetodo deprecato , non è affidabile. E non dovresti usare if- elseper selezionare tra 7 valori, questo è quello che abbiamo switch, o potresti usare un array. Tutto sommato, il tuo codice è sia più lungo che più complicato del necessario.
Ole VV,

1
E usa le abbreviazioni del mese integrate anziché fornire le tue. Più semplice e meno soggetto a errori.
Ole VV,

1
Le classi problematiche utilizzate qui sono state soppiantate anni fa dalle classi java.time . Suggerire il loro uso nel 2018 è un cattivo consiglio.
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

Programma per trovare il giorno della settimana fornendo all'utente la data di immissione mese e anno usando il java.util.scannerpacchetto:

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

Cordiali saluti, le vecchie e problematiche classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e Java 9. Vedi Tutorial di Oracle .
Basil Bourque,

@Dave è davvero bello da leggere? 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);

Ottieni il valore del giorno fornendo il timestamp corrente.


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
Sarebbe utile aggiungere qualche spiegazione della risposta per completare il codice.
Ritlew,

1

il metodo seguente recupera sette giorni e restituisce il nome breve dei giorni nell'Array elenco in Kotlin, ma puoi semplicemente riformattare in formato Java, presentando solo l'idea di come Calendar può restituire un nome breve

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

mettere risultati come

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

1
Se OP chiede informazioni su Java, sarebbe meglio rispondere con Java.
mypetlion,

1
Non c'è motivo per cui dovremmo voler utilizzare la Calendarclasse nel 2019. È mal progettata e obsoleta da tempo. Invece raccomando LocalDatee DayOfWeekda java.time, la moderna API di data e ora di Java .
Ole VV,

0

Puoi utilizzare il metodo seguente per ottenere il giorno della settimana passando una data specifica,

Qui per il metodo set della classe Calendar, la parte Tricky è l'indice per il parametro del mese inizierà da 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
Questa risposta è sconsiderata, usando terribili vecchie classi di data e ora che sono ora legacy, soppiantate dalle classi java.time. Inoltre, questo codice ignora il problema cruciale del fuso orario dopo l'applicazione goffa di una classe data-ora a un problema solo data. Invece, vedi la risposta corretta per java.time di Przemek .
Basil Bourque,

0

La classe Calendar ha la funzionalità displayName integrata:

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

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

Disponibile da Java 1.6. Vedi anche la documentazione Oracle


0

Funziona correttamente ...

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

Fornisce il metodo integrato getDayOfWeek () per ottenere il giorno di una settimana particolare:

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

Per assegnare il valore di enum l.getDayOfWeek()a una stringa, probabilmente potresti usare il metodo di Enum chiamato name()che restituisce il valore di oggetto enum.


2
Le risposte su Stack Overflow sono migliori se includono alcune spiegazioni e frammenti di codice.
Basil Bourque,

@ David, ho cercato la differenza nella mia modifica e nella tua, non riesco a trovarla. Sarebbe bello avere le informazioni su come modificarlo.
Pochmurnik

@OrdinaryDraft hai aggiunto listHolidays.add(LocalDate.of(year, 1, 1));a alla risposta. Se vuoi migliorare la risposta, dovresti aggiungere la tua. Spero che aiuti
David

Sì, in seguito ho controllato la mia modifica per confrontarla con la tua versione. Sembra che abbia copiato quella riga per errore.
Pochmurnik,

-3

Di seguito sono riportate le due righe dello snippet che utilizza l'API Time 1.8 di Java per le vostre esigenze.

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

2
L'approccio mostrato qui è già stato trattato in almeno 4 buone risposte pubblicate molto tempo fa. Non vedo alcun valore aggiunto da questo duplicato.
Basil Bourque,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.