java 从给定的月/年打印日历
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25070823/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Printing a Calendar from Given Month/Year
提问by nmore
I'm working on a Java assignment and it involves printing a calendar after the user specifies a month and a year. I cannot use the Calendar or GregorianCalendar classes. My problem is that the calendar does not correctly print months with their first day on a Saturday. I've looked at my code for about an hour now, and I'm not sure what went wrong. I'm using Zeller's Congruence to find the first day of the month, which is represented by "h".
我正在处理一项 Java 任务,它涉及在用户指定月份和年份后打印日历。我不能使用 Calendar 或 GregorianCalendar 类。我的问题是日历在星期六的第一天没有正确打印月份。我已经看了我的代码大约一个小时了,我不确定出了什么问题。我正在使用 Zeller's Congruence 来查找该月的第一天,用“h”表示。
For example, the calendar on March 2008 (incorrectly) looks like this:
例如,2008 年 3 月的日历(错误地)如下所示:
March 2008
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Here is my code:
这是我的代码:
package calendar;
import java.util.Scanner;
public class Calendar
{
private static int numDays = 0;
private static int h = 0;
public static boolean leap(int year)
{
if(((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0))
{
return true;
}
else
{
return false;
}
}
public static void firstDayOfYear(int year)
{
int month = 13;
year--;
h = (1 + (int)(((month + 1) * 26) / 10.0) + year + (int)(year / 4.0) + 6 * (int)(year / 100.0) + (int)(year / 400.0)) % 7;
String dayName = "";
switch(h)
{
case 0: dayName = "Saturday"; break;
case 1: dayName = "Sunday"; break;
case 2: dayName = "Monday"; break;
case 3: dayName = "Tuesday"; break;
case 4: dayName = "Wednesday"; break;
case 5: dayName = "Thursday"; break;
default: dayName = "Friday"; break;
}
System.out.println("The first day of the year is " + dayName);
}
public static void firstDayOfMonth(int month, int year)
{
if(month == 1 || month == 2)
{
month += 12;
year--;
}
h = (1 + (int)(((month + 1) * 26) / 10.0) + year + (int)(year / 4.0) + 6 * (int)(year / 100.0) + (int)(year / 400.0)) % 7;
String dayName = "";
switch(h)
{
case 0: dayName = "Saturday"; break;
case 1: dayName = "Sunday"; break;
case 2: dayName = "Monday"; break;
case 3: dayName = "Tuesday"; break;
case 4: dayName = "Wednesday"; break;
case 5: dayName = "Thursday"; break;
default: dayName = "Friday"; break;
}
System.out.println("The first day of the month is " + dayName);
}
public static void numDaysInMonth(int month, int year)
{
int[] days = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (month == 2 && leap(year)) days[month] = 29;
numDays = days[month];
System.out.println("The number of days in the month is " + numDays);
}
public static void printCal(int month, int year)
{
String[] monthNames = {"","January","February","March","April","May","June","July","August","September","October","November","December"};
System.out.println(" " + monthNames[month] + " " + year);
System.out.println("Su Mo Tu We Th Fr Sa");
for (int i = 0; i < h - 1; i++)
System.out.print(" ");
for (int i = 1; i <= numDays; i++)
{
System.out.printf("%2d ", i);
if (((i + h - 1) % 7 == 0) || (i == numDays)) System.out.println();
}
}
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
System.out.print("Enter month (1-12): ");
int month = input.nextInt();
if(month < 1 || month > 12)
{
System.out.println("Invalid month. Valids inputs are 1-12.");
System.exit(0);
}
System.out.print("Enter year: ");
int year = input.nextInt();
if(year < 1753)
{
System.out.println("Invalid year. Valid inputs are 1753 and beyond.");
System.exit(0);
}
if(leap(year))
{
System.out.println(year + " is a leap year.");
}
else
{
System.out.println(year + " is NOT a leap year.");
}
firstDayOfYear(year);
firstDayOfMonth(month, year);
numDaysInMonth(month, year);
printCal(month, year);
}
}
回答by Swapnil
Your code will have the same issue for every month that starts with a Saturday. This means that the problem is probably in this line -
您的代码在以星期六开始的每个月都会出现相同的问题。这意味着问题可能出在这一行 -
for (int i = 0; i < h - 1; i++)
System.out.print(" ");
Having h
as 7 instead of 0 here will fix it for you. You can either fix that here or you may need to start h
from 1 to 7 instead of 0 to 6 and make other required changes of course.
在h
这里使用 7 而不是 0 将为您修复它。您可以在此处修复该问题,或者您可能需要h
从 1 到 7 而不是 0 到 6 开始,当然还可以进行其他所需的更改。
回答by nmore
The problem is that your indexes are messed up. What that means is that you are starting your months and days of the weak from 1 instead of 0. However here
问题是你的索引搞砸了。这意味着你从 1 而不是 0 开始你几个月和几天的弱点。但是在这里
h = (1 + (int)(((month + 1) * 26) / 10.0) + year + (int)(year / 4.0) + 6 * (int)(year / 100.0) + (int)(year / 400.0)) % 7
the %7 at the end makes it start at 0! This causes the loop
最后的 %7 使它从 0 开始!这导致循环
for (int i = 0; i < h - 1; i++)
System.out.print(" ");
to be
成为
for (int i = 0; i < -1; i++)
System.out.print(" ");
since h is 0 for Saturday.
因为星期六的 h 是 0。
To fix this issue, you should start allindexes in your functions with 0. Then when you get user input indexed at 1, simply subtract 1 and pass it into your functions. Then you also won't have that blank entry in front of all your arrays (which by the way should be static finals at the top of the class).
要解决此问题,您应该从0开始函数中的所有索引。然后当您将用户输入索引为 1 时,只需减去 1 并将其传递给您的函数。然后你也不会在你所有的数组前面有那个空白条目(顺便说一下,它应该是类顶部的静态决赛)。
回答by Smit
I Know you got the answer. But here is quick fix (Sorry its kinda hacky) that you can incorporate to correct your indexes for Saturday without making many changes to your code.
我知道你得到了答案。但这里有一个快速修复(对不起,它有点老套),您可以将其合并以更正周六的索引,而无需对代码进行很多更改。
System.out.println("Su Mo Tu We Th Fr Sa");
int xx = h == 0 ? 7 : h; // Correct the index for Saturday.
for (int i = xx; i > 1; i--) // Reversing the loop condition
System.out.print(" ");
for (int i = 1; i <= numDays; i++) {
System.out.printf("%2d ", i);
if (((i + h - 1) % 7 == 0) || (i == numDays))
System.out.println();
}
回答by BSrinivas
This will fix the leap year issue
这将解决闰年问题
if ((((i + h) % 7 == 0) || (i == numDays) && leap(year)))