2014-11-22 4 views
0

Im пытается получить мою программу, чтобы распечатать день любой даты, используя функции, которые я должен написать и объявить, хотя для ранних дат месяца программа не кажется напечатайте день записи. Уравнение в функции dayOfTheWeek, w, было дано нам для вычисления в течение дня, хотя для кода «floor», который нужно использовать, мне пришлось создать еще одну «частную статическую» функцию по причинам, которые я не совсем уверен, по какой-либо причине почему было бы здорово, а также любая причина, по которой моя программа не вернёт правильный день для определенных дат.распечатка дня недели в Java

вот мой код, любая помощь будет принята с благодарностью :)

import java.util.Scanner; 
import javax.swing.JOptionPane; 

public class DayOfTheWeek { 

    public static final int SEPTEMBER_APRIL_JUNE_NOVEMBER_DAYS = 30; 
    public static final int REST_OF_YEAR_DAYS = 31; 
    public static final int LEAP_YEAR_FEB = 29; 
    public static final int NORMAL_FEB = 28; 
    public static final int MONTHS = 12; 

    public static void main(String[] args) { 
     try 
     { 
      String input = JOptionPane.showInputDialog("Enter date (day/month/year):"); 
      Scanner scanner = new Scanner(input); 
      scanner.useDelimiter("/"); 
      int day = scanner.nextInt(); 
      int month = scanner.nextInt(); 
      int year = scanner.nextInt(); 
      scanner.close(); 

      String numberEnding = numberEnding (day); 
      String dayEnding = day + numberEnding; 
      String monthName = monthName (month); 
      String dayName = dayOfTheWeek (day, month, year); 

      if (validDate(day, month, year)) 
      { 
       JOptionPane.showMessageDialog(null, dayName + " " + dayEnding + " " + monthName 
         + " " + year + " is a valid date."); 
      } 
      else 
      { 
       JOptionPane.showMessageDialog(null, "" + dayEnding + " " + monthName 
         + " " + year + " is not a valid date.", 
         "Error", JOptionPane.ERROR_MESSAGE); 
      } 
     } 
     catch (NullPointerException exception) 
     { 
     } 
     catch (java.util.NoSuchElementException exception) 
     { 
      JOptionPane.showMessageDialog(null, "No number entered. \nPlease restart and try again.", 
        "Error", JOptionPane.ERROR_MESSAGE); 
     }  
    } 
    public static boolean validDate(int day, int month, int year) { 
     return ((year >= 0) && (month >= 1) && (month <= MONTHS) && 
       (day >= 1) && (day <= daysInMonth(month, year))); 
    } 
    public static int daysInMonth(int month, int year) { 
     int monthDays; 
     switch (month) 
     { 
     case 2: 
      monthDays = isLeapYear(year) ? LEAP_YEAR_FEB : NORMAL_FEB;            
      break; 
     case 4: 
     case 6: 
     case 9: 
     case 11: 
      monthDays = SEPTEMBER_APRIL_JUNE_NOVEMBER_DAYS; 
      break; 
     default: 
      monthDays = REST_OF_YEAR_DAYS; 
     } 
     return monthDays; 
    } 
    public static boolean isLeapYear(int year) { 
     return (((year%4 == 0) && (year%100 != 0)) || (year%400 == 0)); 
    } 
    public static String numberEnding(int day) { 
     String dayEnding = ""; 
     int remainder = day%10; 
     if (day >= 10 && day <= 20) 
     { 
      dayEnding = "th"; 
     } 
     else 
     { 
      switch (remainder) 
      { 
      case 1: 
       dayEnding = "st"; 
       break; 
      case 2: 
       dayEnding = "nd"; 
       break; 
      case 3: 
       dayEnding = "rd"; 
       break; 
      default: 
       dayEnding = "th"; 
       break; 
      } 
     } 
     return dayEnding; 
    } 
    public static String monthName(int month) { 
     String monthName = ""; 
     switch (month) 
     { 
     case 1: 
      monthName = "January"; 
      break; 
     case 2: 
      monthName = "February"; 
      break; 
     case 3: 
      monthName = "March"; 
      break; 
     case 4: 
      monthName = "April"; 
      break; 
     case 5: 
      monthName = "May"; 
      break; 
     case 6: 
      monthName = "June"; 
      break; 
     case 7: 
      monthName = "July"; 
      break; 
     case 8: 
      monthName = "August"; 
      break; 
     case 9: 
      monthName = "September"; 
      break; 
     case 10: 
      monthName = "October"; 
      break; 
     case 11: 
      monthName = "November"; 
      break; 
     case 12: 
      monthName = "December"; 
      break; 
     default: 
     } 
     return monthName; 
    } 
    public static String dayOfTheWeek (int day, int month, int year){ 
     String dayName = ""; 
     int Y; 
     if (month == 1 || month == 2) 
     { 
      Y = (year-1); 
     } 
     else 
     { 
      Y = (year); 
     } 
     int y = Y%100; 
     int c = Y/100; 
     int w = (day + floor(2.6 * (((month+9) % 12)+ 1) -0.2) 
       + y + floor(y/4) + floor(c/4) - (2*c)); 
     w = (w%7); 
     if (w < 0) 
     { 
      w += 7; 
     } 
     switch (w) 
     { 
     case 0: 
      dayName = "Sunday"; 
      break; 
     case 1: 
      dayName = "Monday"; 
      break; 
     case 2: 
      dayName = "Tuesday"; 
      break; 
     case 3: 
      dayName = "Wednesday"; 
      break; 
     case 4: 
      dayName = "Thursday"; 
      break; 
     case 5: 
      dayName = "Friday"; 
      break; 
     case 6: 
      dayName = "Saturday"; 
      break; 
     } 
     return dayName; 
    } 
    private static int floor(double d) { 
     return 0; 
    } 
} 
+0

Если вы ловите исключение, вы должны сделать что-то с ним (по крайней мере, бревенчатый его/информировать пользователя). – SJuan76

ответ

1

Я считаю, нужно использовать метод Math.floor(). Просто назвать это в месте вашего метода этажа:

(day + Math.floor(2.6 * (((month+9) % 12)+ 1) -0.2) 
       + y + Math.floor(y/4) + Math.floor(c/4) - (2*c)); 

Вы также можете отбрасываемое уравнение непосредственно с помощью (int):

int w = (int) (day + 2.6 * ((month+9) % 12 + 1) - 0.2 + y + (y/4) + (c/4) - (2*c)); 

Однако в вашем случае я думаю, что значения будут округлены ненадлежащее использование литья , поэтому вы, вероятно, должны использовать метод пола.

Если вы хотите дополнительную информацию о различиях между полом и литья вот StackOverflow вопрос, который решает это: Cast to int vs floor

+0

Я тоже не слишком уверен, и да, это то, что мне было интересно, потому что возвращение на эту последнюю функцию - всего лишь 0, хотя это было единственно для меня, чтобы заставить уравнение «w» работать ... наш лектор дал нам это уравнение «w = (день + пол (2,6 * ((месяц + 9)% 12) + 1) - 0,2) + y + пол (y/4) + пол (c/4) - 2c) mod 7 ", и я не уверен, что он оценил бы его слишком много, или что? – roughosing

+0

спасибо, что я сказал, что вы сказали, и напечатайте более точные даты, но почему-то некоторые из дат являются днем ​​или впереди по какой-то странной причине .... – roughosing

+0

@GregPenrose Мне кажется, я знаю, в чем проблема. Я считаю, что ваш лектор хотел, чтобы вы использовали метод Math.floor(). Это имеет различное поведение от литья к int напрямую. Я отредактирую свой ответ за то, что считаю верным. – dogwin

0

Я хотел бы использовать Joda-Time библиотеку.

import org.joda.time.DateTime 

final DateTime date = new DateTime(); 
final int dayOfWeek = date.getDayOfWeek(); 

Смотрите Joda-Time User Guide для получения дополнительной информации и примеров ..

+0

Извините, я пропустил, что вы должны писать это сами. –