第一种 硬写(思路:找某一年的一月一日做参考,计算输入的日期到参考日期,间隔的天数,计算输入日期的一号是周几)

// 准备数据System.out.println("**********欢 迎 使 用 万 年 历***********");Scanner scanner = new Scanner(System.in);System.out.println("请输入年份:");int year = scanner.nextInt();if (year < 0) {System.out.println("年份错误!");return;}System.out.println("请输入月份:");int month = scanner.nextInt();if (month > 12 || month < 1) {System.out.println("月份错误!");return;}int day = 30;// 当月的天数int day_num = 0;// 从2001年1月到当前月的天数int yearTest = 2001;// 2001年int weekTest = 1;// 2001年1月1日周一int week = 0;// 当前月1号是周几// 处理数据// 年份大于2001年if (year >= yearTest) {int year_1 = year - yearTest;// 2001年到今年多少年day_num = year_1 * 365 + year_1 / 4 - year_1 / 100 + year_1 / 400;// 判断当前月1号离今年1月1号有多少天for (int i = 1; i <= month; i++) {if ((i % 2 != 0 && i <= 7) || (i % 2 == 0 && i >= 8)) {if (i != month)//不算当前月份day_num += 31;elseday = 31;} else if (i == 2) {if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {if (i != month)day_num += 29;elseday = 29;} else {if (i != month)day_num += 28;elseday = 28;}} else {if (i != month)day_num += 30;elseday = 30;}}week = (day_num + weekTest) % 7;// 当前月1号是周几} else {// 年份小于2001int year_1 = yearTest - year - 1;// 2001年到今年多少年day_num = year_1 * 365 + year_1 / 4 - year_1 / 100 + year_1 / 400;if (year_1 % 4 != 0) {// 闰年年数=year_1/4向上取整(2000年是闰年)day_num++;}// 判断当前月1号离今年1月1号有多少天for (int i = 12; i >= month; i--) {if ((i % 2 != 0 && i <= 7) || (i % 2 == 0 && i >= 8)) {day_num += 31;//当i==month的时候也要加,即算上当前月day = 31;} else if (i == 2) {if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {day_num += 29;day = 29;} else {day_num += 28;day = 28;}} else {day_num += 30;day = 30;}}// 星期从周天往前数week = (weekTest + 7 - (day_num % 7)) % 7;}// 输出数据System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t");for (int i = 0, j = 1; j <= day; i++) {if (i < week) {System.out.print("\t");} else {System.out.print(j++ + "\t");}if (i % 7 == 6) {System.out.println();}}

第二种方法:借助java.Calendar类,思路不变

System.out.println("请输入日期(例如:2021-06-01):");Scanner scan = new Scanner(System.in);Date date = new Date();Calendar cal = Calendar.getInstance();try {// 设置日期字符串格式SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");date = sdf.parse(scan.next());} catch (ParseException e) {System.out.println("输入日期格式有误!");System.out.println("再皮腿给你打折!!!");return;}cal.setTime(date);// 将日期设置成日历int day = cal.get(Calendar.DAY_OF_MONTH);// 取出今天是几号cal.set(Calendar.DAY_OF_MONTH, 1);// 将日期设置为每月的1号,方便计算每月1一号是周几System.out.println("日\t一\t二\t三\t四\t五\t六\t");for (int i = 1, j = 1; i <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); j++) {// i控制输出每月的几号// j控制每周换行以及正式打印号数之前的空格// cal.getActualMaximum(Calendar.DAY_OF_MONTH)当前月有多少天if (j >= cal.get(Calendar.DAY_OF_WEEK)) {// 当前月一号是周几cal.get(Calendar.DAY_OF_WEEK)if (i == day) {// 标记当天System.out.print("*" + i + "\t");} else {System.out.print(i + "\t");}i++;} else {// 打印空格System.out.print("\t");}// 控制每周换行if (j % 7 == 0) {System.out.println();}}

java万年历的两种实现方式相关推荐

  1. java动态代理两种实现方式

    代理顾名思义就是代理别人完成某件任务,比如张三代理李四去交物业费.张三就是代理人,李四就是被代理人. Java代理实现,有静态代理和动态代理,静态代理就是代码在编译成class文件后,就已经有代理类的 ...

  2. Java线程的两种实现方式

    前言 线程是程序的一条执行线索,执行路径,是程序使用cpu的最小单位.线程本身不能运行,它只能运行在程序中,线程是依赖于程序存在的. 多线程的意义 其实任何一个程序的执行都需要获得cpu的执行权,是由 ...

  3. java中的uuid是啥,UUID在Java中的两种发作方式

    需求: 集群环境下需要产生uuid,uuid的作用不言而喻 转发请注明出处:http://snv.iteye.com/ 环境: org.safehaus.jug jug 2.0.0 asl 或: or ...

  4. java之Map对象转java对象的两种简单方式

    我们在处理数据的时候,经常用到map对象转java对象,下面我们用代码演示下,希望能够帮助到有这方面需求的老哥. 要转换的java对象: public class Person {private In ...

  5. java定时任务的两种实现方式

    一.Timer 现在项目中用到需要定时去检查文件是否更新的功能.timer正好用于此处. 用法很简单,new一个timer,然后写一个timertask的子类即可. package comz.auto ...

  6. 初始化一个java空数组_Java 数组的两种初始化方式

    一.数组 1.数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只要知道下标,就可以快速的计算出偏移量,通过首元素内存地址加上偏移量,就 ...

  7. Java两种排序方式快慢比较

    2019独角兽企业重金招聘Python工程师标准>>> Java中List的排序方式有两种,现在我们测试下这两种排序方式的快慢吧,我们需要用到两个类, 一个是运行程序的Main类,另 ...

  8. java 同步方式 lock_java的两种同步方式, Synchronized与ReentrantLock的区别

    java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...

  9. Java多线程两种实现方式的对比

    Java多线程两种实现方式的对比 一种,直接继承Thread类 一种,实现Thread类的Runnable接口 两种方式的区别 比如,售票厅有四个窗口,可以发售某日某次列出的100张车票,此时,100 ...

  10. Java技术分享:升级所安装Java版本的两种方式

    在进行Java开发的时候我们可能会需要升级所安装的Java版本,那么你知道应该如何安装吗?小千今天就来给大家介绍两种方式. 一.卸载掉原本安装的Java,下载最新安装包安装即可. 这个步骤就不介绍了, ...

最新文章

  1. 通知 | 2021年度“RONG”奖学金入围答辩名单公布
  2. 清华“法律数据科研平台”向校内师生开放试运行
  3. luogu_P3313 [SDOI2014]旅行
  4. OpenCV 高级API:TextDetectionModel和TextRecognitionModel
  5. AbstractAutoWireCapableBeanFactory 对Bean 实例进行属性依赖注入
  6. SAP Kyma(Extension Factory on SAP Cloud Platform)的架构简介
  7. 本地工程提交github
  8. sql2003安装sql2005企业版
  9. ZOJ - 3880 Demacia of the Ancients
  10. 新唐N76E003单片机用APROM模拟EEPROM每次下载写入值复位为0XFF
  11. 新加坡圣淘沙亲子游自助游景点购票攻略
  12. 计算机开机速度慢是什么原因,电脑开机慢是什么原因?怎么处理?
  13. “数字孪生”语境下的城市:拼图模式与航向之争
  14. Document读取XML
  15. C#批量剪切视频文件
  16. 树形结构数据封装(及拉平)的几种方法
  17. 如何选型PLM软件?PLM选型时注意哪些事项呢?
  18. linux Runtime
  19. 四川率先发布新基建新消费新产业创新发展行动计划
  20. 有道云导入html,有道云笔记网页剪报怎么用 有道云笔记网页剪报使用教程

热门文章

  1. div html表格样式,table 表格 div + css 样式
  2. 云智推任务提交版拉新系统源码-任务分销系统
  3. 一文读懂TOGAF企业架构
  4. 【全栈计划 —— 单片机】——Part_01 单片机数字电路基础+C51基础概念
  5. 修改群晖mac 及 sn
  6. android中高德地图的poi检索
  7. android 游戏摇杆ui,LayaBox实现2D游戏八方向虚拟摇杆
  8. MATLAB--基本绘图函数
  9. 海康威视ivms-4200图文说明
  10. 学习笔记——Servlet原理