用Java打印出星期几

时间:2014-11-22 20:02:53

标签: java math

我试图让我的程序使用我必须编写和声明的函数打印出任何给定日期的日期,尽管在该月的早期日期程序似乎没有打印写入日。在dayOfTheWeek函数w中的等式被给予我们计算当天,尽管对于' floor'要使用的代码我必须创建另一个私有静态'功能因为我不太确定,任何理由为什么会很好以及为什么我的程序没有在某些日期返回正确的日期。

这是我的代码,非常感谢任何帮助:)

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

2 个答案:

答案 0 :(得分: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));

但是,在你的情况下,我认为使用强制转换不正确地舍入值,所以你应该使用floor方法。

如果您想了解关于楼层和投射之间差异的一些其他信息,请参阅Stackoverflow问题:Cast to int vs floor

答案 1 :(得分:0)

我会使用Joda-Time库。

import org.joda.time.DateTime

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

有关更多信息和示例,请参阅Joda-Time User Guide