题目:输出任意年份任意月份的日历表(公元后)
思路:
1.已知1年1月1日是星期日,1 % 7 = 1 对应的是星期日,2 % 7 = 2 对应的是星期一,以此类推
2.计算当年以前所有天数+当年当月1号之前所有天数
a.年份分平年闰年,平年365天,闰年366天
b.闰年的判断方法year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)若为真,则为闰年否则为平年
c.定义平年/闰年数组,包含各月天数
d.遍历数组求和,计算当年当月前总天数
e.当年以前所有天数+当年当月前总天数+1即为1年1月1日到当年当月1日的总天数
3.总天数对7取模,根据结果判断当月1号是星期几,输出空白区域
4.输出当月日历表,逢星期六换行
*/
import java.util.Scanner
class FindMonthList {
public static void main(String[] args){
Scanner sc = new Scanner(System.in)
System.out.println("请输入年份:")
int year = sc.nextInt() //年份
if (year < 1) { //判断非法输入年份
System.out.println("输入错误!")
return
}
System.out.println("请输入月份:")
int month = sc.nextInt() //月份
if (month < 1 || month > 12) { //判断非法输入月份
System.out.println("输入错误!")
return
}
//输出表头
System.out.println("-------" + year + " 年 " + month + " 月 " + "-------")
System.out.println()
System.out.println("日 一 二 三 四 五 六")
//计算当前年份以前所有天数beforeYearTotalDay每4年一个闰年,闰年366天,平年365天
int beforeYearTotalDay = ((year - 1) / 4 * 366) + (year-1 - ((year - 1) / 4)) * 365
int[] arrLeapYear = {0,31,29,31,30,31,30,31,31,30,31,30,31} //闰年各月天数 int数组
int[] arrNormalYear = {0,31,28,31,30,31,30,31,31,30,31,30,31} //平年各月天数 int数组
int beforeMonthTotalDay = 0 //定义本年当月之前月份的总天数
if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) { //判断当前年份是否是闰年
for (int i = 0 i < month i ++ ) { //for循环计算当月之前总天数
//计算当前月份之前的所有天数
beforeMonthTotalDay = beforeMonthTotalDay + arrLeapYear[i]
}
//判断当月1日是星期几
int totalDay = beforeYearTotalDay + beforeMonthTotalDay + 1
int week = totalDay % 7//已知1年1月1日是星期日,即模7得1对应的是星期日
for (int i = 0 i < (week - 1 + 7) % 7 i ++) { //如果写成i < (week-1)会出现i<-1的情况
System.out.print(" ")//输出开头空白
}
for (int i = 1 i <= arrLeapYear[month] i ++ ) { //for循环输出各月天数
System.out.print(i + " ")
if (i < 10 ) { //小于10的数补一个空格,以便打印整齐
System.out.print(" ")
}
if (i % 7 == ((7-(week - 1)) % 7 ) || i == arrLeapYear[month]) {//每逢星期六/尾数换行
System.out.println()
}
}
} else { //不是闰年就是平年
for (int i = 0 i < month i ++ ) { //for循环计算出当月之前月份总天数
beforeMonthTotalDay = beforeMonthTotalDay + arrNormalYear[i]
}
//判断当月1日是星期几
int totalDay = beforeYearTotalDay + beforeMonthTotalDay + 1
int week = totalDay % 7//已知1年1月1日是星期日,即模7得1对应的是星期日
for (int i = 0 i < (week - 1 + 7) % 7 i ++) { //如果写成i < (week-1)会出现i<-1的情况
System.out.print(" ")//输出开头空白
}
for (int i = 1 i <= arrNormalYear[month] i ++ ) {//for循环输出各月天数
System.out.print(i + " ")
if (i < 10 ) { //小于10的数补一个空格,以便打印整齐
System.out.print(" ")
}
if (i % 7 == ((7-(week - 1)) % 7 ) || i == arrNormalYear[month]) {//每逢星期六/尾数换行
System.out.println()
}
}
}
}
}
显示效果:
我改造了一下你的代码 :
package com.mikuma.calendarimport java.util.GregorianCalendar
import java.util.Scanner
public class Calendar{
public static void main(String[] args){
int year = 0
int month = 0
Scanner scanner = new Scanner(System.in)
System.out.println("请输入您要查询的年份")
year = scanner.nextInt()
System.out.println("请输入您要查询的月份")
while (true){
month = scanner.nextInt()
if (month < 0 || month > 12){
System.out.println("月份输入有误,请重新输入")
}else{
break
}
}
printPermanentCalendar(year, month)
}
/**
* 输出万年历
*
* @param year
* @param month
*/
private static void printPermanentCalendar(int year,int month){
int days = 0
int totaldays = 0//获取1990年至查询的年份的天数
for (int i = 1900 i < year i++){
totaldays = totaldays + (isLeapYear(i) ? 366 : 365)
}
int beforedays = 0//到指定月份的天数
for (int i = 1 i <= month i++){
switch (i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31
break
case 4:
case 6:
case 9:
case 11:
days = 30
break
case 2:
days = isLeapYear(year) ? 29 : 28
break
default:
break
}
if (i < month){
beforedays = beforedays + days
}
}
totaldays = totaldays + beforedays//总计天数,以判断周几;
int weekDay = 0
int temp = (1 + totaldays) % 7
if (temp == 0){//1990年1月1日星期一,据此日0天星期一,以此类推
weekDay = 0
}else{
weekDay = temp
}
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六")
for (int i = 0 i < weekDay i++){
System.out.print("\t")
}
for (int i = 1 i <= days i++){
System.out.print(i + "\t")
if ((totaldays + i) % 7 == 6){
System.out.print("\n")
}
}
}
private static boolean isLeapYear(int year){
return new GregorianCalendar().isLeapYear(year)
}
}
运行:
对比了下 360日历:
结果正确
我们再测试下 2017 年 2月
对比 360 日历
也是正确
给你一个现成的,我自己写的。import java.awt.*
import java.util.*
import javax.swing.*
import java.awt.event.*
public class WanNianLi extends JFrame implements ActionListener {
private static int year,month,days
private JButton[] btn=new JButton[days]
WanNianLi() {
super("万年历")
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
GridLayout bl=new GridLayout(5,7)
JPanel pane=new JPanel()
pane.setLayout(bl)
for (int i=0i<daysi++) {
int temp=i+1
btn[i]=new JButton(""+temp)
btn[i].addActionListener(this)
pane.add(btn[i])
}
setContentPane(pane)
pack()
setLookAndFeel()
setVisible(true)
}
public static void main(String[] args) {
if (args.length>0)
year=Integer.parseInt(args[0])
else
year=1982
if (args.length>1)
month=Integer.parseInt(args[1])
else
month=1
GetDays gd=new GetDays(year,month)
days=gd.getDays()
new WanNianLi()
}
public void actionPerformed(ActionEvent evt) {
Object src=evt.getSource()
for (int i=0i<daysi++)
if (src==btn[i]) {
int day=i+1
GetWeekday gw=new GetWeekday(year,month,day)
String str=""
switch (gw.getWeekday()) {
case 1:
str="天"
break
case 2:
str="一"
break
case 3:
str="二"
break
case 4:
str="三"
break
case 5:
str="四"
break
case 6:
str="五"
break
case 7:
str="六"
break
}
setTitle(year+"年"+month+"月"+day+"日"+"星期"+str)
repaint()
}
}
private void setLookAndFeel() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
SwingUtilities.updateComponentTreeUI(this)
}catch(Exception e){
System.out.print(e.toString())
}
}
}
//////////////
//获取星期几//
//////////////
class GetWeekday {
private Calendar cal=Calendar.getInstance()
private static int weekday
public int getWeekday() {
return weekday
}
GetWeekday(int y,int m,int d) {
cal.clear()
cal.set(Calendar.YEAR,y)
cal.set(Calendar.MONTH,m-1)
cal.set(Calendar.DAY_OF_MONTH,d)
weekday=cal.get(Calendar.DAY_OF_WEEK)
}
}
////////////////////
//获取当前月的天数//
////////////////////
class GetDays {
private static int days
public int getDays() {
return days
}
GetDays(int y,int m) {
GregorianCalendar gc=new GregorianCalendar()
switch (m) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days=31
break
case 4:
case 6:
case 9:
case 11:
days=30
break
case 2:
if (gc.isLeapYear(y))
days=29
else
days=28
break
}
}
}