2014-11-22 30 views
0

我试着让我的程序打印出来使用,我要编写和申报功能的任何给定日期的当天,虽然每月的月初日期似乎没有程序打印写日。 dayOfWeek函数w中的方程式给我们计算了一天,尽管对于要使用的'floor'代码,我必须根据我不太确定的原因创建另一个'private static'函数,因为为什么会是伟大的以及为什么我的程序为什么没有在特定日期返回正确的日期。打印出一周的在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 2014-11-22 20:06:47

回答

1

我相信你需要使用Math.floor()方法。直接使用(int)

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

您也可以施放公式:代替你的地板的方法简单地调用这个

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

然而,在你的情况我觉得值会不恰当地使用铸造四舍五入,所以你应该使用floor方法。

如果您想在地板上和铸造这里之间的区别一些额外的信息是,解决这一个计算器问题: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 2014-11-24 00:02:38

+0

感谢香港专业教育学院做了什么你说的和其打印更准确日期,但由于某些原因,一些日期是每天的背后,或提前,一些奇怪的原因.... – roughosing 2014-11-24 00:09:56

+0

@GregPenrose我想我知道是什么问题。我相信你的讲师希望你使用Math.floor()方法。这有不同的行为直接转换为int。我会编辑我的答案,我相信这是正确的。 – dogwin 2014-11-24 01:08:41

0

我会使用Joda-Time库。

import org.joda.time.DateTime 

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

见乔达时间User Guide获取更多信息和例子..

+0

抱歉,我错过了你应该自己写这个。 – 2014-11-22 20:38:39