
【Java作业】万年历
获取目标年份、目标月份、目标日期 初始化Java.util.Calendar实例 根据每月第一天的星期几计算起始控制值 生成每月的日历数据 打印日历数据
发布日期:2021-05-07 23:22:15
浏览次数:19
分类:精选文章
本文共 4071 字,大约阅读时间需要 13 分钟。
万年日历设计与实现
一、实验内容
给定某年某月某日是星期几,能给出任何一年(12月)的输出。输出效果如下:
1月 1日 星期六1月 2日 星期日...12月 31日 星期五
二、问题分析(含数据模型)
万年历中的每行含每月的3小段数据,由于每月1日的起始位置和每月的结束位置不一,导致此问题的边界处理比较麻烦。解决问题的方法如下:
根据每月1日周几的数据统一折算到周日为起点的值,如上图的1月1日星期六,折算到周日的起点值为-5,在打印完日期时,该值增1,可把12月的起点控制量设定为1数组:
int ctlValue[]={-5,-1,-1,-4,1,-2,-4,0,-3,-5,-1,-3}
为解决每月的末尾不一问题,需要根据每月“1~最大天数”来区分是否正常的改约日期,所以另设一每月最大天数的数组,如:
int daysOfMonth[]={31,28,31,30,31,30,31,31,30,31,30,31}
对非常的日期(在范围“1~最大天数”之外),按打印数据格式要求来控制。
ctlValue、daysOfMonth数组内容的求值可借助于Calendar类来实现:
- Calendar.getInstance() 获取实例
- set方法设置日期,如
obj.set(2012,1,1)
设置成2012年1月1日的日期 - get(Calendar.DAY_OF_WEEK) 获取当前日期是星期几
- getActualMaximum(Calendar.DATE) 获取当前月的最大天数
三、算法设计
算法采用以下步骤:
四、算法实现(程序)
Month类
package com.dreamchaser.work1;public class Month { // 月份 int month; // 每月天数 int day; // 一号周几 int first; // 数据的高度 private int height; public Month(int month, int day, int first) { this.month = month; this.day = day; this.first = first; this.height = (first + day) / 7; }}
PerpetualCalendar类
package com.dreamchaser.work1;import java.util.Calendar;public class PerpetualCalendar { public static void main(String[] args) { // 给定一个日期 int year = 2020; int month = 10; int day = 6; Calendar calendar = Calendar.getInstance(); for (int i = 0; i < 12; i += 3) { calendar.set(year, i, 1); Month m1 = new Month(i + 1, calendar.getActualMaximum(Calendar.DATE), calendar.get(Calendar.DAY_OF_WEEK) - 1); calendar.set(year, i + 1, 1); Month m2 = new Month(i + 2, calendar.getActualMaximum(Calendar.DATE), calendar.get(Calendar.DAY_OF_WEEK) - 1); calendar.set(year, i + 2, 1); Month m3 = new Month(i + 3, calendar.getActualMaximum(Calendar.DATE), calendar.get(Calendar.DAY_OF_WEEK) - 1); Month[] months = {m1, m2, m3}; display(months); } } /** 用于打印该月份的日历 */ public static void display(Month[] months) { for (int j = 0; j < 3; j++) { if (j == 2) { System.out.println("\t\t" + months[j].month + "月日历\t\t\t\t\t\t\t"); } else { System.out.print("\t\t" + months[j].month + "月日历\t\t\t\t\t\t\t"); } } for (int j = 0; j < 3; j++) { if (j == 2) { System.out.println("日\t一\t二\t三\t四\t五\t六\t\t\t\t"); } else { System.out.print("日\t一\t二\t三\t四\t五\t六\t\t\t\t"); } } int date = 0; for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { if (j == 2) { for (int z = 0; z < 7; z++) { date = i * 7 + z - months[j].first + 1; if (date <= 0 || date > months[j].day) { System.out.print("\t"); } else if (months[j].day < 10) { System.out.print(date + "\t"); } else { System.out.print(date + "\t"); } } System.out.println("\t\t\t"); } else { for (int z = 0; z < 7; z++) { date = i * 7 + z - months[j].first + 1; if (date <= 0 || date > months[j].day) { System.out.print("\t"); } else if (months[j].day < 10) { System.out.print(date + "\t"); } else { System.out.print(date + "\t"); } } System.out.println("\t\t\t"); } } } }}
思路说明
利用jdk中Calendar类来获取每个月天数,每月第一天星期数等数据,然后由此构造Month模型对象,并由display方法来展示输出。
五、实验测试
测试结果如下:
2020年10月日历:10月 1日 星期三10月 2日 星期四...10月 31日 星期日
六、实验总结
通过本次实验,我学会了Java中的Calendar类的使用方法。Calendar类为我们提供了便捷的日期操作方法,大大简化了日期处理的复杂性。通过本次实验,我对如何利用Java类库处理日期问题有了更深入的理解,并掌握了如何设计和实现一个万年日历系统。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月05日 08时41分24秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
《小王子》里一些后知后觉的道理
2019-03-06
《自私的基因》总结
2019-03-06
《山海经》总结
2019-03-06
《非暴力沟通》总结
2019-03-06
《你当像鸟飞往你的山》总结
2019-03-06
《我是猫》总结
2019-03-06
《抗糖化书》总结
2019-03-06
apache虚拟主机配置
2019-03-06
光盘作为yum源
2019-03-06
PHP 正则表达式资料
2019-03-06
PHP官方网站及PHP手册
2019-03-06
mcrypt加密以及解密过程
2019-03-06
mysql连续聚合
2019-03-06
go等待N个线程完成操作总结
2019-03-06
消息队列 RocketMQ 并发量十万级
2019-03-06
ReactJs入门教程-精华版
2019-03-06
乐观锁悲观锁应用
2019-03-06
简单说说TCP三次握手、四次挥手机制
2019-03-06
.net Core 使用IHttpClientFactory请求
2019-03-06