簡體   English   中英

用Java打印出星期幾

[英]printing out the day of the week in Java

我試圖讓我的程序使用我必須編寫和聲明的函數來打印出任何給定日期的日期,盡管對於該月的早期日期,該程序似乎並未打印出寫入日期。 給了dayOfTheWeek函數w中的方程式以進行一天的計算,盡管對於要使用的“ floor”代碼,由於不確定的原因,我不得不創建另一個“ private static”函數,例如為什么會很棒,以及為什么我的程序沒有在某些日期返回正確的日期的原因。

這是我的代碼,任何幫助將不勝感激:)

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()方法。 只需調用它代替您的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問題: 鑄造為int vs地板

我將使用Joda-Time庫。

import org.joda.time.DateTime

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

有關更多信息和示例,請參見《 Joda-Time 用戶指南》

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM