Java Calendar.DAY_OF_WEEK дает неправильный день - PullRequest
0 голосов
/ 03 мая 2018

Что не так с кодом ниже? Это дает неправильный день для любой даты года.

import java.util.Scanner;
import java.util.Calendar;
public class Solution {
    public static String getDay(String d, String m, String y) {

        String[] days = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};
        Calendar c = Calendar.getInstance();
        c.set(Integer.parseInt(y), Integer.parseInt(m), Integer.parseInt(d)); 
        return days[c.get(Calendar.DAY_OF_WEEK) - 1]; 
    }
public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String m = in.next();
        String d = in.next();
        String y = in.next();

        System.out.println(getDay(d, m, y));
    }
}

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Проще всего иметь значения Scanner read int вместо строк:

    int m = in.nextInt();
    int d = in.nextInt();
    int y = in.nextInt();

    System.out.println(LocalDate.of(y, m, d).getDayOfWeek());

Когда я кормлю 5 4 2018 (сегодняшняя дата), я получаю FRIDAY, что правильно.

Если вы должны использовать строки:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M/d/u");

    String m = in.next();
    String d = in.next();
    String y = in.next();

    System.out.println(LocalDate.parse(m + '/' + d + '/' + y, dateFormatter).getDayOfWeek());

Класс Calendar, который вы использовали, давно устарел, плохо спроектирован и иногда неудобен в работе. Вместо этого я рекомендую java.time, современный Java API даты и времени. Это намного приятнее. С одной стороны, она нумерует месяцы года так же, как люди.

Также встроены названия дней недели, поэтому не изобретайте велосипед заново. Ваши строки совпадают с именами значений перечисления DayOfWeek в java.time, поэтому просто напечатайте их, чтобы получить нужные вам строки. Если вам не нужны прописные буквы или названия дней на другом языке, используйте DayOfWeek.getDisplayName или DateTimeFormatter.

Ссылка: Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

0 голосов
/ 03 мая 2018

См. Документацию для класса Calendar: https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#set-int-int-int-

Значение месяца проиндексировано на 0, поэтому, если вы указали 3 в качестве значения месяца, оно будет интерпретировано как «апрель».

...