分析,我们可以分为四个步骤来做
(1) 给定年月 如:2018-11,计算这个月有多少天
(2)给定年月日 如:2018-11-1,计算这天是这一年的第多少天呢?
(3)计算指定年月日是星期几 如2018-11-1是星期几
(4)打印日历
步骤(1)
分析
给定年月如:2018-11,计算这个月有多少天
给定年月判断这个月有多少天
31天:1 3 5 7 8 10 12
30天:4 6 9 11
28天:2(平年)
29天:2(闰年)能被400整除,或者能被4整除但是不能被100整除
public static int getMonthDay(int year, int month){
int days = 0;
switch (month){
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 2:
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){
days = 29;
}else{
days = 28;
}
break;
default:
System.out.println("输入月份不合法");
break;
}
return days;
}
分析
(2)给定年月日如: 2018-4-10 ,计算这天是这一年的第多少天呢?
如:2018-4-10

只要我们计算出来本月之前的每一个月份的天数的和,再加上当月的 天数即可
/**
* (2)给定年月日如: 2019-4-5 ,计算这天是这一年的第多少天呢?
1 2 3 4
31 28 31 5
*
*/
public static int getYearDays(int year, int month, int day){
int days = 0;
for (int i = 1; i < month; i++) {
days += getMonthDay(year, i);
}
days += day;
return days;
}
步骤三:
分析
(3)计算指定年月日是星期几 如2018-11-1是星期几
套公式:
int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
year:当前年
days:指定年月日是这一年的第几天
/**
* (3)计算指定年月日是星期几 如2018-11-1是星期几
*
* int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
*/
public static int getWeek(int year, int month, int day){
int days = getYearDays(year, month, day);
//计算星期的公式
int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
return week;
}
步骤(4)
打印日历 分析:给定年月,打印当月日历
总结规律,我们发现每个月1号是星期几,那么
这个月第一行前面就有几个灰色的空,计算出
来空的数量在第一行打印,后面的以此类推的打印,
遇到7的倍数就换行即可。
public static void printData(int year, int month){
System.out.println("日\t一\t二\t三\t四\t五\t六");
//获得这个年月的1号的星期
int week = getWeek(year, month, 1);
System.out.println();
int count = 0;
//打印空白
for (int i = 0; i < week; i++) {
count++;
System.out.print("\t");
}
//打印数字,获得这个年月的天数
int monthDay = getMonthDay(year, month);
for (int i = 1; i <= monthDay ; i++) {
count++;
System.out.print(i+"\t");
if(count%7 == 0){
System.out.println();
System.out.println();
}
}
}
完整代码:
package cn.tx.demo;
import java.util.Scanner;
public class Demo1 {
/**
* (1) 给定年月如:2018, 11,计算这个月有多少天
* 30 4 6 9 11
*
* 31 1 3 5 7 8 10 12
*
* 28 2(平年)
*
* 29 2(闰年) 这一年能被400整除, 能被4整除但是不能被100整除
*
*/
public static int getMonthDay(int year, int month){
int days = 0;
switch (month){
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 2:
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){
days = 29;
}else{
days = 28;
}
break;
default:
System.out.println("输入月份不合法");
break;
}
return days;
}
/**
* (2)给定年月日如: 2019-4-5 ,计算这天是这一年的第多少天呢?
1 2 3 4
31 28 31 5
*
*/
public static int getYearDays(int year, int month, int day){
int days = 0;
for (int i = 1; i < month; i++) {
days += getMonthDay(year, i);
}
days += day;
return days;
}
/**
* (3)计算指定年月日是星期几 如2018-11-1是星期几
*
* int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
*/
public static int getWeek(int year, int month, int day){
int days = getYearDays(year, month, day);
//计算星期的公式
int week = (year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
return week;
}
/**
*
日 一 二 三 四 五 六
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
* @param args
*/
public static void printData(int year, int month){
System.out.println("日\t一\t二\t三\t四\t五\t六");
//获得这个年月的1号的星期
int week = getWeek(year, month, 1);
System.out.println();
int count = 0;
//打印空白
for (int i = 0; i < week; i++) {
count++;
System.out.print("\t");
}
//打印数字,获得这个年月的天数
int monthDay = getMonthDay(year, month);
for (int i = 1; i <= monthDay ; i++) {
count++;
System.out.print(i+"\t");
if(count%7 == 0){
System.out.println();
System.out.println();
}
}
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
while (true){
System.out.println();
System.out.println();
System.out.println("请输入yyyy-MM格式的年月获得日历");
//1999-12
String s1 = s.nextLine();
if ("exit".equals(s1)){
break;
}
String[] data = s1.split("-");
printData(new Integer(data[0]), new Integer(data[1]));
}
System.out.println("程序结束");
}
}
根据本人多年从业以及学习经验,录制了一套最新的Java精讲视频教程,如果你现在也在学习Java,在入门学习Java的过程当中缺乏系统的学习教程,你可以加QQ群654631948领取下学习资料,面试题,开发工具等,群里有资深java老师做答疑,每天也会有基础部分及架构的直播课,也可以加我的微信renlliang2013做深入沟通,只要是真心想学习Java的人都欢迎。
java基础教程:https://ke.qq.com/course/149432?tuin=57912c43
Java分布式互联网架构/微服务/高性能/springboot/springcloud:
https://ke.qq.com/course/179440?tuin=57912c43

本文介绍如何使用Java实现万年历功能,包括计算特定年月的天数、确定日期在当年的位置、计算星期以及打印日历的详细步骤。通过实例代码解析每个步骤,适合Java初学者学习。
834

被折叠的 条评论
为什么被折叠?



