java实现万年历功能
1 import java.util.Scanner; 2 3 /** 4 * @author 海绵摆摆嘉心糖 5 * @Classname Calendar 6 * @Description 万年历的效果实现,定义的初始月份为2001年一月1日 星期一 7 * @Date 2021/9/24 9:53 8 */ 9 public class Calendar { 10 11 static Scanner sc = new Scanner(System.in); 12 static boolean tf; 13 14 public static void main(String[] args) { 15 System.out.println("请输入你想要查看的年份:"); 16 int year = sc.nextInt(); 17 System.out.println("请输入你想要查询的月份:"); 18 int month = sc.nextInt(); 19 tf = (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)); 20 // 接收定义年到指定年的天数数据 21 int years = yearNumber(year); 22 // 接收一月1日到指定月的天数数据 23 int months = monthNumber(month); 24 sc.close(); 25 // 计算2001年之前某年某月的第一天是星期几 26 if (year < 2001){years = 6 - (years % 7);} 27 // 将年天数和月天数相加得到2001年到指定年月的天数 28 int numbers = years + months; 29 // 输出上面的星期数 30 week(); 31 System.out.println(); 32 // 输出日历数字 33 printNumber(numbers, month); 34 } 35 36 /** 37 * 输出日期号码,指定在星期几开始输出1号 38 */ 39 private static void printNumber(int numbers, int month) { 40 switch (month) { 41 case 1: 42 case 3: 43 case 5: 44 case 7: 45 case 8: 46 case 10: 47 case 12: 48 // 计算在星期几开始输出1号 49 for (int i = 0; i < (numbers % 7); i++) { 50 System.out.print("\t"); 51 System.out.print("\t"); 52 } 53 for (int i = 1; i <= 31; i++) { 54 System.out.print("\t"); 55 if (i < 10){System.out.print("0");} 56 System.out.print(i); 57 System.out.print("\t"); 58 if (((numbers + i) % 7) == 0){System.out.println();} 59 } 60 break; 61 case 2: 62 for (int k = 0; k < (numbers % 7); k++) { 63 System.out.print("\t"); 64 System.out.print("\t"); 65 } 66 int number = 28; 67 int k = 1; 68 if (tf){number += 1;} 69 while (k < number){ 70 System.out.print("\t"); 71 if (k < 10){System.out.print("0");} 72 System.out.print(k); 73 System.out.print("\t"); 74 if (((numbers + k) % 7) == 0){System.out.println();} 75 k++; 76 } 77 break; 78 case 4: 79 case 6: 80 case 9: 81 case 11: 82 for (int j = 0; j < (numbers % 7); j++) { 83 System.out.print("\t"); 84 System.out.print("\t"); 85 } 86 for (int j = 1; j < 30; j++) { 87 System.out.print("\t"); 88 if (j < 10){System.out.print("0");} 89 System.out.print(j); 90 System.out.print("\t"); 91 if (((numbers + j) % 7) == 0){System.out.println();} 92 } 93 break; 94 default:break; 95 } 96 } 97 98 /** 99 * 此方法是用来计算输入年的一月1日到输入月的1日的天数 100 * @return number 101 */ 102 private static int monthNumber(int month) { 103 int number = 0; 104 for (int i = 1; i < month; i++) { 105 number += 30; 106 switch (i){ 107 case 1: 108 case 3: 109 case 5: 110 case 7: 111 case 8: 112 case 10: 113 case 12: 114 number += 1; 115 break; 116 case 2: 117 if (tf){ 118 number -= 1; 119 }else { 120 number -= 2; 121 } 122 break; 123 default:break; 124 } 125 } 126 return number; 127 } 128 129 /** 130 * 此方法是用来计算输入年份的一月1号到定义的初始年份的一月1号的天数 131 * @return number of years 132 */ 133 private static int yearNumber(int year) { 134 int number = 0; 135 if (year > 2001){ 136 for (int i = 2001; i < year; i++) { 137 number += 365; 138 if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0)){number += 1;} 139 } 140 }else { 141 for (int i = 2001; i > year; i--) { 142 number += 365; 143 if (((i % 4 ==0) && (i % 100 != 0)) || (i % 400 == 0)){number += 1;} 144 } 145 } 146 return number; 147 } 148 149 /** 150 * 输出上方星期 151 */ 152 private static void week() { 153 String[] weeks = new String[] {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"}; 154 for (String week : weeks) { 155 System.out.print(week); 156 System.out.print("\t"); 157 } 158 } 159 }
这里我定义的是2001年的一月1号,这一天是星期一,这样为了后面的计算做准备。
然后从控制台获取客户想要查询的年份和月份,这样我们就可以计算出他要查询的那一个月的1号是星期几了,这样我们就可以控制当月1号在星期几开始输出;
计算我们初始定义的年份到要查询的年份的月份的天数,分两步计算,先计算2001年的1月1日到查询年的1月1日有多少天,然后计算查询年的1月1日到查询月的1日有几天,将两个数据相加余7就可以得到我们想要的结果。
然后要向前推算的话,用余7来计算的话就会出错,因为这样推过去是要反着推,所以就先计算出2001年1月1日到所要查询的那一年的1月1日的天数,然后将它余7,再用6减去这个余数,最后用这个余数加上这一年1月1日到要查询的那一个月的1号余7就可以得到我们想要的结果,最后将它输出就好了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix