用Java实现在控制台输出指定年月的日历

纯算法写太麻烦?Calender对象写可香了:
(万年历二)JAVA在控制台输出万年历(Calendar版)
控制台打印太难看?已更新js控制页面的啦版:
(万年历三)利用js在html页面打印万年历

一、成品效果

  • 在控制台输出年份和月份展示如图所示:

二、实现思路

  • 1.首先我们知道一个星期有7天,一年有365天(闰年366天),天数%7的余数就是星期几,所以容易想到,我们只需要设置一个已知的年月天的星期,求出相隔的日期取余即可。
  • 2.如上图所示,我们可以百度查一下,2019年1月1日是星期二,2019年不是闰年,与2020年1月1日刚好差365天,365%7=1,所以往后推一天,2020年1月1日就是星期三。
  • 3.然后我们算出这个月的天数再创建一个7*7的数组,第一行放星期,后面6行放日历每天,就可以把某月的日历保存下来了。

三、代码实现,按步骤:

  • 1.静态变量初始化:
//用一个数组也可以,加个闰年判断即可,这里省事用了两个
//非闰年
static int[] daysP = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//闰年static int[] daysRun = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  • 2.闰年判断:
// 判断闰年public static boolean isRunYear(int year) {boolean flag = false;if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {flag = true;}return flag;}
  • 3.获取1900年1月1日(这天是星期一)到year年month月1日有多少天:
// 获取从1900年1月1日到yer年month月1日有多少天public static int getDaysFrom1990(int year, int month) {int days = 0;// 先算出1900年到year-1年的天数for (int i = 1900; i < year; i++) {if (isRunYear(i)) {days += 366;} else {days += 365;}}// 再加上year年1月到month-1月的天数,因为月份数组从0开始算if (isRunYear(year)) {for (int i = 0; i < month - 1; i++) {days += daysRun[i];}} else {for (int i = 0; i < month - 1; i++) {days += daysP[i];}}return days;}
  • 4.将日历算出并输出:
// 获取指定年月的日历 1900.1.1是星期一public static void getCalendar(int year, int month) {//日历二维数组String[][] calender = new String[7][7];//第一行为星期calender[0][0] = "一    ";calender[0][1] = "二    ";calender[0][2] = "三    ";calender[0][3] = "四    ";calender[0][4] = "五    ";calender[0][5] = "六    ";calender[0][6] = "日";//获取天数int days = getDaysFrom1990(year, month);//获取星期几,0是星期天int weekDay= days % 7;//根据今年是否为闰年来将天数放进二维数组if(isRunYear(year)) {days = daysRun[month-1];}else {days = daysP[month-1];}//存入日历二维数组int j;if (weekDay == 0) {j = 6;}else {j = weekDay;}int count = 1;for (int i = 1; i < calender.length; i++) {if(i!=1) {//第一次外层循环,j按照星期天数定j = 0;}for (; j < calender[0].length; j++) {calender[i][j] =count+""; count++;if (count >= days+1) {break;}}if (count >= days+1) {break;}}//输出万年历//输出第一行for (int i = 0; i < calender[0].length; i++) {System.out.print(calender[0][i]+" ");}//输出其余行System.out.println();for (int i = 1; i < calender.length; i++) {for (int k = 0; k < calender[0].length; k++) {if(calender[i][k]==null) {System.out.print("   ");}else {//向左对齐,两字符宽度输出System.out.printf("%-2d ",(int)Integer.parseInt(calender[i][k]));}}System.out.println();}}

四、完整代码:


import java.time.Year;
import java.util.Arrays;
import java.util.Scanner;//万年历
public class Test10 {static int[] daysP = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };static int[] daysRun = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("===========欢迎来到万年历系统===========");System.out.println("请输入您需要查询的日历年份:");int year = sc.nextInt();if (year < 1900) {System.out.println("请输入1900年以后的年份");System.out.println("程序终止........");return;}System.out.println("请输入您需要查询的日历月份:");int month = sc.nextInt();if (month < 1 || month > 12) {System.out.println("请输入1-12中的月份");System.out.println("程序终止........");return;}System.out.printf("==========%d年%d月的日历为:==========\n",year,month);getCalendar(year, month);}// 判断闰年public static boolean isRunYear(int year) {boolean flag = false;if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {flag = true;}return flag;}// 获取从1900年1月1日到yer年month月1日有多少天public static int getDaysFrom1990(int year, int month) {int days = 0;// 先算出1900年到year-1年的天数for (int i = 1900; i < year; i++) {if (isRunYear(i)) {days += 366;} else {days += 365;}}// 再加上year年1月到month-1月的天数if (isRunYear(year)) {for (int i = 0; i < month - 1; i++) {days += daysRun[i];}} else {for (int i = 0; i < month - 1; i++) {days += daysP[i];}}return days;}// 获取指定年月的日历 1900.1.1是星期一public static void getCalendar(int year, int month) {//日历二维数组String[][] calender = new String[7][7];//第一行为星期calender[0][0] = "一    ";calender[0][1] = "二    ";calender[0][2] = "三    ";calender[0][3] = "四    ";calender[0][4] = "五    ";calender[0][5] = "六    ";calender[0][6] = "日";//获取天数int days = getDaysFrom1990(year, month);//获取星期几,0是星期天int weekDay= days % 7;//根据今年是否为闰年来将天数放进二维数组if(isRunYear(year)) {days = daysRun[month-1];}else {days = daysP[month-1];}//存入日历二维数组int j;if (weekDay == 0) {j = 6;}else {j = weekDay;}int count = 1;for (int i = 1; i < calender.length; i++) {if(i!=1) {//第一次外层循环,j按照星期天数定j = 0;}for (; j < calender[0].length; j++) {calender[i][j] =count+""; count++;if (count >= days+1) {break;}}if (count >= days+1) {break;}}//输出万年历//输出第一行for (int i = 0; i < calender[0].length; i++) {System.out.print(calender[0][i]+" ");}//输出其余行System.out.println();for (int i = 1; i < calender.length; i++) {for (int k = 0; k < calender[0].length; k++) {if(calender[i][k]==null) {System.out.print("   ");}else {//向左对齐,两字符宽度输出System.out.printf("%-2d ",(int)Integer.parseInt(calender[i][k]));}}System.out.println();}}
}

看完后可以使用Calendar类更简单的输出万年历
JAVA在控制台输出万年历二(Calendar版)

(万年历一)JAVA在控制台输出万年历(1900年起)相关推荐

  1. java怎么输出点,Java实现控制台输出两点间距离

    计算两点之间的距离然后在控制台输出,这个题目还是挺简单的.下面我们来看看具体代码. package com.swift; import java.util.Scanner; public class ...

  2. java在控制台输出sql_logger4j配置数据库sql输出控制台

    #-------------------------------- # 设定logger的root level为DEBUG/ERROR/info,指定的输出目的地(appender)为stdout l ...

  3. java在控制台输出空心正方形,菱形,空心菱形

     使用for和if打印一个空心正方形 /*思路:要想打印一个5x5的空心正方形,首先它的第一横行和最后一行都是填满的,需要全部遍历出来,第二三四行和只有左右两条边是出来的,中间部分为空的.因此在打印第 ...

  4. Java实现控制台输出进度条

    char incomplete = '░'; // U+2591 Unicode Character 表示还没有完成的部分char complete = '█'; // U+2588 Unicode ...

  5. java控制台中文乱码_java用控制台输出时出现乱码怎么办

    java用控制台输出时出现乱码怎么办 发布时间:2020-06-26 16:00:24 来源:亿速云 阅读:113 作者:Leah java用控制台输出时出现乱码怎么办?相信很多没有经验的人对此束手无 ...

  6. java控制台输出不同颜色文字

    更改输出样式,不同来源或类型的信息使用不同的输出样式,可以让我们更快地找到想要的信息. 1. java在控制台输出和普通样式不同的字符串,可以用System.err():或System.info(); ...

  7. php打印函数console,PHP内置Web Server探究(2)自定义PHP控制台输出console函数

    PHP内置Web Server探究(二)自定义PHP控制台输出console函数 我们在开发APP的服务器端,当和APP进行联调时通常需要实时跟踪URL请求和参数的接收情况. 但PHP并没有像Pyth ...

  8. java打印输出万年历_用Java编程输出万年历的功能实现

    1.功能实现 输入1查看上个月日历 输入2查看下个月日历 输入3查看去年本月日历 输入4查看明年本月日历 输入5查看指定月份日历 2.代码所导入的包 import java.text.ParseExc ...

  9. 万年历 java程序_用Java编程输出万年历的功能实现

    1.功能实现 输入1查看上个月日历 输入2查看下个月日历 输入3查看去年本月日历 输入4查看明年本月日历 输入5查看指定月份日历 2.代码所导入的包 import java.text.ParseExc ...

最新文章

  1. CtStatement
  2. 1、MySQL为什么需要事务?
  3. QT的QScriptEngineAgent类的使用
  4. js(javascript)取得当前时间小时,分钟,秒 以及毫秒
  5. Python callable 函数 - Python零基础入门教程
  6. 嘉年华回顾丨 王津银带你深入解析自动化运维能力框架
  7. hadoop商品推荐_北京尚学堂学员学习经验分享:商品推荐
  8. 【python之路10】python实例练习
  9. SELECT 基本语法结构
  10. 达思sql数据库修复软件:用友金蝶管家婆思迅中了勒索病毒怎么办?
  11. PackageManager
  12. RMAN-20003错误
  13. 共阳和共阴数码管详细段码(带图)
  14. Dalsa面阵相机外触发接线方式
  15. python时间戳是什么意思_python时间戳是什么
  16. 门店私域流量运营怎么做?
  17. dperf: 一款基于DPDK的千万级HTTP CPS的开源网络压力测试仪
  18. 推出全新的交互式导航和社交导航 iGibson 挑战
  19. 企业邮箱退信提示:“550 5.1.1 User unknown.”
  20. python plot画简单的曲线图

热门文章

  1. 《未来简史》六、动物被我们血腥奴役的今天,会不会是人类自己的明天
  2. bat(batch)
  3. A1489. 抽奖(乔明达)
  4. 没有电池没有芯片,这些塑料瓶子正在联网
  5. 蓝桥杯试题算法训练之数字三角形——Python满分解答
  6. 2020-03-31 获取微信好友真实地址
  7. fabric框架学习
  8. 妹妹画的小恐龙和我用Python画的小恐龙,你更加喜欢谁的!❤️
  9. Jetpack Navigation
  10. 软件测试,作为职场新鸟?我该怎么办?看看资深5年测试的见解......