java - 在 Java 中打印出星期几

标签 java math

我试图让我的程序使用我必须编写和声明的函数打印出任何给定日期的日期,尽管对于该月的早期日期,程序似乎没有打印写入日期。 dayOfTheWeek 函数中的方程 w 被提供给我们来计算这一天,尽管对于要使用的“下限”代码,我必须创建另一个“私有(private)静态”函数,原因我不太确定,任何原因为什么我的程序没有在某些日期返回正确的日期,以及为什么我的程序没有返回正确的日期的任何原因。

这是我的代码,任何帮助将不胜感激:)

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

最佳答案

我相信您需要使用 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

关于java - 在 Java 中打印出星期几,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27081889/

相关文章:

java - linkedList.listIterator(linkedList.size()) 是否优化?

java - 如何分解字符串?

java - 如何在没有互联网访问的情况下配置maven

java - BigDecimal精度爆炸

android - 不存在这样的 acos 函数

java - 计算一个系列

python - 聚类余弦相似度矩阵

java - 如何使用 clientCredentialType ="Basic"将 Java 客户端连接到 WCF 服务

Java:将 "this"实例设置为相同类型的对象

java - 如何通过Java中的纬度/经度点计算两条相交线之间的角度?