java 制作简易日历_如何用Java制作一个简易日历

本文介绍了如何使用Java的SimpleDateFormat和Calendar类制作一个简单的日历小程序。通过用户输入的日期,程序可以显示指定月份的日历,包括当月第一天是星期几以及最大天数。在实现过程中,需要注意日期的格式转换、异常处理以及日历布局的换行逻辑。
摘要由CSDN通过智能技术生成

简易日历制作

记录一下Java实现的一个日历小程序,效果图如下:

052ad3220d21ea007a1377abfae11071.png

实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar。

首先看看这两个类的用法:

类 SimpleDateFormat

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期(Date) -> 文本(String))、解析(文本(String) -> 日期(Date))和规范化。

具体要用到的方法

String pattern) 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。

String source) 从给定字符串的开始解析文本以生成日期。

这里我们使用SimpleDateFormat生成一个格式为“yyyy-MM”的实例,并通过parse方法将我们输入的字符串转换成日期(Date)对象。具体实现如下:

8cec3ae11c21f749bde4af1bb5f6992da9b.jpg

b9b7a6ac3befef59427de556bbea9c16d8c.jpg

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); //生成格式化实例

System.out.print("请输入要查询的月份(yyyy-MM):");

String str= scanner.next(); //获取输入字符串

Date date = null; //要获取的Date对象变量

try{

date= sdf.parse(str); //将字符串转成日期对象,这里会抛出格式转换异常,需要用try..catch进行处理

} catch(Exception e) {

System.out.println("时间格式不正确");

}

通过字符串获取Date对象

类 Calendar

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR(年)、MONTH(月)、Date(日) 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

日历类使我们更好的对时间进行操作,使我们可以轻易获取到具体的某个时间字段,并能对时间字段进行增、减、设置等操作。

日历类是一个抽象类,所以我们不能对其进行实例化,但该类提供了一个静态方法getInstance,所以我们可以通过该方法来获取一个Calendar的对象实例。

我们的目的是做一个日历,而日历最重要的是获取当月第一天是星期几以及获取该月的最大天数,Calendar都为我们提供了具体的方法来实现。

要用到的方法

Date date) 使用给定的 Date 设置此 Calendar 的时间。

我们需要用getInstance方法来获取Calendar实例,并通过上面SimpleDateFormat中字符串转成的Date对象来给我们的Calendar设置时间,最后通过get方法来获取当月第一天是星期几,并通过getActualMaximum方法来获得当月天数。

注意的几点:

Calendar获取的MONTH是从0开始,最大为11

Calendar获取的DAY_OF_WEEK为从1开始,最大为7,且1代表的是星期天,2~7代表是星期一到星期六

具体实现如下:

a8cec40573d3673a5483b7afcf368316afe.jpg

ddaeca58f99d437de78bbf5d0ccbd5d9596.jpg

Calendar calendar = Calendar.getInstance(); //获取Calendar对象

calendar.setTime(date); //给Calendar对象设置时间

int year = calendar.get(calendar.YEAR); //获取所设置的年份

int month = calendar.get(calendar.MONTH); //获取所设置的月

System.out.println("===================="+year+"年"+(month+1)+"月======================");

获取并设置Calendar对象

af239798d176120018c7a4c870aa945ef3d.jpg

992e9dae25bb627c5a6cdb38dd8f2a8e6f8.jpg

c.set(c.DATE, 1);int []dayOfWeek = {7,1,2,3,4,5,6};int weekDay =c.get(c.DAY_OF_WEEK);int firstWeekDay = dayOfWeek[weekDay-1];

获取当月1号星期几

接下来我们要开始打印日期了,由于我们的日期是从1开始显示,一直到当月的最大一天,但我们显示的位置要和星期相对应,所以在这里我把日期(day)开始设置为“-firstWeekDay+1”,来填充前面所需要的空白。

我们还会涉及一个换行的问题,正常逻辑是每7天换行一次,而我们的日期是从“-firstWeekDay+1”开始的,所以我们在计算换行时需要再将其加上。具体实现见代码吧。

afff0e28fc055282879e58ab3ccd728def8.jpg

a7892bb4b0f8996e245a1d169971cae0e7a.jpg

int day = -firstWeekDay+1; //第一天

for (;day<=c.getActualMaximum(c.DATE); day++) {if(day<=0) {

System.out.print("\t"); //day从1开始显示

} else{

System.out.print(day+"\t");

}if((day+firstWeekDay-1)%7 == 0){ //每计7天换行一次

System.out.println();

}

}

打印日历

这样,我们的日历就完成啦。不过这里还有别的一些问题,比如我们在捕获格式转换异常时,如果程序继续往下执行,则可能会发生空指针异常,不过再添加一个异常捕获就好了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值