Comment déterminer le jour de la semaine en passant une date précise?

188

Par exemple, j'ai la date: "23/2/2010" (23 février 2010). Je veux le transmettre à une fonction qui renverrait le jour de la semaine . Comment puis-je faire ceci?

Dans cet exemple, la fonction doit renvoyer String"Tue".

De plus, si vous ne souhaitez que l'ordinal du jour, comment le récupérer?

malReiko
la source

Réponses:

350

Oui. Selon votre cas exact:

  • Vous pouvez utiliser java.util.Calendar:

    Calendar c = Calendar.getInstance();
    c.setTime(yourDate);
    int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
    
  • si vous avez besoin que la sortie soit Tueplutôt que 3 (les jours de la semaine sont indexés à partir de 1 pour dimanche, voir Calendar.SUNDAY), au lieu de passer par un calendrier, reformatez simplement la chaîne: new SimpleDateFormat("EE").format(date)( EEsignifiant "jour de la semaine, version courte" )

  • si vous avez votre entrée sous forme de chaîne, plutôt que Date, vous devriez utiliser SimpleDateFormatpour l'analyser:new SimpleDateFormat("dd/M/yyyy").parse(dateString)

  • vous pouvez utiliser joda-time DateTimeet appeler dateTime.dayOfWeek()et / ou DateTimeFormat.

  • edit: depuis Java 8, vous pouvez maintenant utiliser le package java.time au lieu de joda-time

Bozho
la source
20
Les jours de la semaine commencent à 1 qui est dimanche, donc je pense que mardi serait 3.
Mohammad Banisaeid
13
Par ailleurs, si vous définissez la date dans l'objet Calendar à l'aide de nombres entiers (et non via l'analyse d'une chaîne), sachez que le numéro du mois est basé sur zéro, donc janvier est 0 et décembre est 11.
RenniePet
4
@RenniePet: Bien. Vous pouvez également utiliser des constantes en Calendarclasse, telles que Calendar.SUNDAYou Calendar.JANUARY.
Mohammad Banisaeid
2
Cette réponse était une excellente réponse quand elle a été écrite. Aujourd'hui, vous voudrez les classes désormais obsolètes Calendar, Dateet DateTimeFormat(et le temps Joda aussi) et utiliser les java.timeclasses Java 8 , par exemple YearMonthou LocalDate. En savoir plus dans cette réponse .
Ole VV
4
FYI, les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir le didacticiel d'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);

Utilisez ce code pour trouver le nom du jour à partir d'une date d'entrée.Simple et bien testé.

JDGuide
la source
1
Si vous utilisez cette méthode, notez attentivement l'ordre des jours et des mois.
Joel Christophel
1
Je pense que vous devez le mettre dans un bloc try catch
Shafaet
1
FYI, les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir le didacticiel d'Oracle .
Basil Bourque
Android implémente uniquement LocalDate après l'API 26.
Jacob Sánchez
29

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

Le résultat est le: sam.28 déc.2013

Le constructeur par défaut prend « la valeur par défaut » Locale , alors faites attention à l' utiliser lorsque vous avez besoin d' un modèle spécifique.

public SimpleDateFormat(String pattern) {
    this(pattern, Locale.getDefault(Locale.Category.FORMAT));
}
Nikolay Hristov
la source
21

tl; dr

Utilisation de 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

Voir ce code s'exécuter en direct sur IdeOne.com (mais ne Locale.USfonctionne que là-bas).

java.time

Voir mon exemple de code ci-dessus et voir la bonne réponse pour java.time par Przemek .

Nombre ordinal

si seulement l'ordinal du jour est souhaité, comment le récupérer?

Pour le nombre ordinal, envisagez DayOfWeekplutôt de passer autour de l' objet enum tel que DayOfWeek.TUESDAY. Gardez à l'esprit que a DayOfWeekest un objet intelligent, pas seulement une chaîne ou un simple nombre entier. L'utilisation de ces objets enum rend votre code plus auto-documenté, garantit des valeurs valides et fournit une sécurité de type .

Mais si vous insistez, demandez DayOfWeekun numéro . Vous obtenez 1-7 du lundi au dimanche selon la norme ISO 8601 .

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

Joda-Time

MISE À JOUR: Le projet Joda-Time est maintenant en mode maintenance. L'équipe conseille de migrer vers les classes java.time. Le framework java.time est intégré à Java 8 (ainsi que rétroporté vers Java 6 et 7 et adapté à Android ).

Voici un exemple de code utilisant la bibliothèque Joda-Time version 2.4, comme mentionné dans la réponse acceptée de Bozho . Joda-Time est de loin supérieur aux classes java.util.Date/.Calendar fournies avec Java.

LocalDate

Joda-Time propose la LocalDateclasse pour représenter une date uniquement sans heure ni fuseau horaire. Exactement ce que cette question appelle. Les anciennes classes java.util.Date/.Calendar fournies avec Java n'ont pas ce concept.

Analyser

Analysez la chaîne en une valeur de date.

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

Extrait

Extrait de la valeur de date le numéro et le nom du jour de la semaine.

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

Déverser

Dump dans la 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 );

Courir

Lorsqu'il est exécuté.

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

À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes java.time?

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .

Basil Bourque
la source
15

java.time

Utilisation du java.timeframework intégré à Java 8 et versions ultérieures.

L' énumération peut générer une chaîne du nom du jour automatiquement localisée dans la langue humaine et les normes culturelles d'un . Spécifiez un pour indiquer que vous souhaitez une forme longue ou un nom abrégé.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
Przemek
la source
1
Cela ne peut être utilisé que dans Oreo et au-dessus des apis.
codepeaker
2
@codepeaker La plupart des fonctionnalités java.time sont rétroportées vers Java 6 et Java 7 dans le projet ThreeTen-Backport . Adapté pour Android antérieur (<26) dans ThreeTenABP . Voir Comment utiliser ThreeTenABP… .
Basil Bourque
9

Vous pouvez essayer le code suivant:

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));
   }
}
SHB
la source
Comment cette réponse ajoute-t-elle de la valeur au-delà de celle des deux ou trois réponses précédentes utilisant LocalDate? Avez-vous lu ceux-ci avant de poster?
Basil Bourque
1
C'est une bonne réponse, et elle est différente de toutes les précédentes. Il utilise l'API LocalDate.of () pour construire la date, et il est beaucoup plus court que la plupart des autres réponses (parfois une réponse courte est meilleure que longue) ...
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);
    }
}
hitesh
la source
belle solution, je trouvais exactement ce type de solution, ma ligne requise qui a résolu mon problème. String dayOfWeek = calendar.getDisplayName (Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.US) .toUpperCase ();
Muhammad Azam
9

Pour Java 8 ou version ultérieure , Localdate est préférable

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

Remarque: si l'entrée est définie par chaîne / utilisateur, vous devez l'analyser en int .

MST
la source
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());
Ramesh Thoutam
la source
5

Une autre façon «amusante» est d'utiliser l' algorithme de Doomsday . C'est une méthode beaucoup plus longue, mais elle est également plus rapide si vous n'avez pas besoin de créer un objet Calendrier avec une date donnée.

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;
    }
}
alain.janinm
la source
5

Peut utiliser l'extrait de code suivant pour une entrée comme (day = "08", month = "05", year = "2015" et la sortie sera "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();
rab
la source
1
Cette réponse est peu judicieuse, car elle utilise d'anciennes dates-heures gênantes qui sont maintenant héritées, supplantées par les classes java.time modernes.
Basil Bourque
1
C'est la question posée sur Hackerrank.
Prathamesh More
5

Réponse en une ligne:

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

Exemple d'utilisation:

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
}
Sahil Chhabra
la source
Cela a fonctionné, j'avais juste besoin de remplacer .name () par 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;
}
Az.MaYo
la source
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.
Ayarnish
la source
@Ayarnush Comment votre réponse ajoute-t-elle de la valeur au - delà de la réponse de Przemek publiée le mois dernier?
Basil Bourque
2

Il y a un défi sur la date et l'heure du hackerrank Java

personnellement, je préfère la classe LocalDate.

  1. Importer java.time.LocalDate
  2. Récupérez localDate en utilisant la méthode "of" qui prend 3 arguments au format "int".
  3. enfin, obtenez le nom de ce jour en utilisant la méthode "getDayOfWeek".

Il y a une vidéo sur ce défi.

Solution Java Date and Time Hackerrank

J'espère que cela aidera :)

Ravi Solanki
la source
Si un autre à venir ici pour HackerRank Java Date et heure et que vous voulez utiliser cette Calendarclasse, S'il vous plaît noter que la setméthode dans le calendrier prend des mois à partir de 0 à savoir 0 for January. Je vous remercie!
Sagar Devkota
2

Ajout d'une autre façon de le faire exactement ce que l'OP a demandé, sans utiliser les dernières méthodes intégrées:

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;
}
Spriha
la source
1
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.
Alex Riabov
1
C'est à plus d'un titre la manière découragée de le faire. Votre code ne peut pas être compilé. Vous ne devriez pas utiliser les classes SimpleDateFormatet Date. En particulier, vous ne devez pas utiliser la getDayméthode obsolète , elle n'est pas fiable. Et vous ne devriez pas utiliser if- elsepour sélectionner parmi 7 valeurs, c'est pour cela que nous avons switch, ou vous pouvez utiliser un tableau. Dans l'ensemble, votre code est à la fois plus long et plus compliqué que nécessaire.
Ole VV
1
Et utilisez les abréviations de mois intégrées plutôt que de fournir les vôtres. Plus simple et moins sujet aux erreurs.
Ole VV
1
Les classes gênantes utilisées ici ont été supplantées il y a des années par les classes java.time . Suggérer leur utilisation en 2018 est un mauvais conseil.
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;
    }
}
Sandeep.N
la source
2

Programme pour trouver le jour de la semaine en donnant le mois et l'année de la date d'entrée de l'utilisateur à l'aide du java.util.scannerpackage:

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));
    }
}
Personne
la source
FYI, les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir le didacticiel d'Oracle .
Basil Bourque
@Dave est-ce vraiment agréable à lire? 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);

Obtenez la valeur du jour en fournissant l'horodatage actuel.

Amit
la source
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);
    }

}
Abhishek
la source
2
Il serait utile d'ajouter une explication de la réponse pour compléter le code.
ritlew
1

La méthode ci-dessous récupère sept jours et renvoie le nom court des jours dans List Array à Kotlin, vous pouvez simplement reformater ensuite au format Java, en présentant simplement une idée de la façon dont le calendrier peut renvoyer un nom court

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

des résultats comme

I/System.out: Wed
    Tue
    Mon
    Sun
I/System.out: Sat
    Fri
    Thu
masokaya
la source
1
Si OP pose des questions sur Java, il serait préférable de répondre avec Java.
mypetlion
1
Il n'y a aucune raison de vouloir utiliser la Calendarclasse en 2019. Elle est mal conçue et obsolète depuis longtemps. Au lieu de cela, je recommande LocalDateet DayOfWeekde java.time, l'API de date et d'heure Java moderne .
Ole VV
0

Vous pouvez utiliser la méthode ci-dessous pour obtenir le jour de la semaine en passant une date spécifique,

Ici, pour la méthode set de la classe Calendar, la partie Tricky est que l'index du paramètre month commencera à 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;
    }
Hardik Patel
la source
3
Cette réponse est malavisée, utilisant de terribles anciennes classes date-heure qui sont maintenant héritées, supplantées par les classes java.time. En outre, ce code ignore le problème crucial du fuseau horaire après avoir appliqué maladroitement une classe date-heure à un problème de date uniquement. Au lieu de cela, voyez la bonne réponse pour java.time par Przemek .
Basil Bourque
0

La classe Calendar a une fonctionnalité displayName intégrée:

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

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

Disponible depuis Java 1.6. Voir aussi la documentation Oracle

Leo Ufimtsev
la source
0

Cela fonctionne correctement ...

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

Il fournit la méthode intégrée getDayOfWeek () pour obtenir le jour d'une semaine particulière:

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

Pour affecter la valeur de enum l.getDayOfWeek()à une chaîne, vous pouvez probablement utiliser la méthode de Enum appelée name()qui renvoie la valeur de l'objet enum.

Ganesh Chowdhary Sadanala
la source
2
Les réponses sur Stack Overflow sont meilleures si elles incluent des explications ainsi qu'un extrait de code.
Basil Bourque
@David, je cherchais la différence entre mon montage et le vôtre, je ne le trouve pas. Ce serait bien d'obtenir les informations sur la façon de modifier.
Pochmurnik
@OrdinaryDraft vous avez ajouté un listHolidays.add(LocalDate.of(year, 1, 1));à la réponse. Si vous souhaitez améliorer la réponse, vous devez ajouter la vôtre. J'espère que ça aide
David
Oui, j'ai vérifié plus tard ma modification pour la comparer avec votre version. Il semble que j'ai copié cette ligne par erreur.
Pochmurnik
-3

Vous trouverez ci-dessous les deux lignes d'extrait utilisant l'API Java 1.8 Time pour vos besoins.

LocalDate localDate = LocalDate.of(Integer.valueOf(year),Integer.valueOf(month),Integer.valueOf(day));
String dayOfWeek = String.valueOf(localDate.getDayOfWeek());
Hardik Patel
la source
2
L'approche présentée ici a déjà été abordée dans au moins 4 bonnes réponses publiées il y a longtemps. Je ne vois aucune valeur ajoutée à ce duplicata.
Basil Bourque