J'ai une classe DayOfWeek qui prend une date de l'utilisateur et imprime le jour de la semaine à cette date.

Par exemple, l'utilisateur saisira sa date sous la forme: (au format MM DD YYYY)

07 22 2016

Et la sortie doit être

VENDREDI

Voici ma classe:

public class DayOfWeek{
    public static void main(String[] args){
        System.out.println("Enter the date (Format: MM DD YYYY) :");
        Scanner sc = new Scanner(System.in);
        String month = sc.next();
        String day = sc.next();
        String year = sc.next();
        int m = Integer.parseInt(month);
        int d = Integer.parseInt(day);
        int y = Integer.parseInt(year);
        Calendar cal = Calendar.getInstance();
        Date date = new Date(y, m, d);
        cal.setTime(date);
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
        System.out.println((sdf.format(dayOfWeek)).toUpperCase());
    }
}

Cependant, lorsque j'entre la date indiquée ci-dessus (07 22 2016), je n'obtiens pas le résultat requis (FRIDAY). Au lieu de cela, la sortie est le jour de la semaine actuel sur mon système. Je suis totalement coincé sur le problème.

2
Faiq Irfan 23 juil. 2017 à 17:44

2 réponses

Meilleure réponse

Vous passez actuellement un int à SimpleDateFormat ... vous devriez passer la valeur Date. Vous n'avez pas du tout besoin d'un Calendar pour cela:

// BAD CODE: DON'T USE - KEEP READING
import java.text.*;
import java.util.*;

public class DayOfWeek {
    public static void main(String[] args){
        System.out.println("Enter the date (Format: MM DD YYYY) :");
        Scanner sc = new Scanner(System.in);
        String month = sc.next();
        String day = sc.next();
        String year = sc.next();
        int m = Integer.parseInt(month);
        int d = Integer.parseInt(day);
        int y = Integer.parseInt(year);
        // Note the changes here
        Date date = new Date(y - 1900, m - 1, d);
        SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
        System.out.println(sdf.format(date).toUpperCase());
    }
}

J'ai mis l'avertissement ici parce que vous utilisez un constructeur Date obsolète - et il est obsolète pour de bonnes raisons. Fondamentalement, java.util.Date est une API terrible et vous devriez éviter de l'utiliser si vous le pouvez. Votre appel initial à new Date(y, m, d) a été interrompu car le premier paramètre de java.util.Date(int, int, int) représente l'année avec une base de 1900 (donc une valeur de 117 signifie l'année 2017) et le deuxième paramètre représente le mois avec une base de 0 ( donc une valeur de 6 signifie juillet). Ensuite, il y a la conversion implicite du fuseau horaire, dont vous ne voulez vraiment pas.

Vous feriez beaucoup d’utiliser java.time, et dans ce cas, la classe LocalDate:

import java.time.*;
import java.time.format.*;
import java.util.*;

public class DayOfWeek {
    public static void main(String[] args){
        System.out.println("Enter the date (Format: MM DD YYYY) :");
        Scanner sc = new Scanner(System.in);
        String month = sc.next();
        String day = sc.next();
        String year = sc.next();
        int m = Integer.parseInt(month);
        int d = Integer.parseInt(day);
        int y = Integer.parseInt(year);
        LocalDate date = LocalDate.of(y, m, d);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE");
        System.out.println(formatter.format(date).toUpperCase());
    }
}

Enfin, votre approche d'analyse de l'entrée utilisateur n'est pas non plus idéale - je suggérerais d'utiliser un DateTimeFormatter pour cela également:

import java.time.*;
import java.time.format.*;

public class DayOfWeek {
    public static void main(String[] args){
        System.out.println("Enter the date (Format: MM DD YYYY) :");
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("MM dd yyyy");
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        LocalDate date = LocalDate.parse(line, parser);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE");
        System.out.println(formatter.format(date).toUpperCase());
    }
}
6
Jon Skeet 23 juil. 2017 à 14:55
Calendar c = Calendar.getInstance();
c.setTime(yourDate);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);

Si vous avez besoin que la sortie soit Tue plutôt que 3 (les jours de la semaine sont indexés à partir de (1), au lieu de passer par un calendrier, reformatez simplement le string: new SimpleDateFormat("EE").format(date) (EE signifiant "jour de la semaine, version courte") .

Remarque Comme indiqué par Jon Essayez et utilisez la dernière API Date Time Formatter à cet effet, l'API Date est dépréciée.

Si vous avez votre entrée sous forme de chaîne plutôt que de date, vous devez utiliser SimpleDateFormat pour l'analyser

: new SimpleDateFormat("dd/M/yyyy").parse(dateString)
0
Rahul Singh 23 juil. 2017 à 14:57