简易日历制作

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

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

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

类 SimpleDateFormat

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

具体要用到的方法

  • SimpleDateFormat(String pattern) 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat
  • Date parse(String source) 从给定字符串的开始解析文本以生成日期。

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

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都为我们提供了具体的方法来实现。

要用到的方法

  • Calendar getInstance() 使用默认时区和语言环境获得一个日历。
  • void setTime(Date date) 使用给定的 Date 设置此 Calendar 的时间。
  • int get(int field) 返回给定日历字段的值。
  • int getActualMaximum(int field) 根据当前Calendar设置的时间来获取指定字段的最大值。

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

注意的几点:

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

具体实现如下:

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对象

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”开始的,所以我们在计算换行时需要再将其加上。具体实现见代码吧。

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();}
}

打印日历

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

转载于:https://www.cnblogs.com/JuanF/p/9338226.html

如何用Java制作一个简易日历相关推荐

  1. 怎么用java做日历_如何用Java制作一个简易日历

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

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

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

  3. 用java编写日历_如何用Java制作一个简易日历

    简易日历制作 记录一下Java实现的一个日历小程序,效果图如下: 实现以上的效果,我们需要用到两个类:SimpleDateFormat和Calendar. 首先看看这两个类的用法: 类 SimpleD ...

  4. 使用Java制作一个简易的远控终端

    使用Java制作一个简易的远控终端 远控终端的本质 1.服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息 2.客户端执行消息内容(即执行服务端 ...

  5. 如何用java写一个年日历

    如何用java写一个年日历 没啥难的,话不多说上代码

  6. 如何用JAVA制作一个漂亮的表格

    如何用JAVA制作一个漂亮的表格 表格图片: 选中一行时高亮显示,且字体变为红色: 在表格中添加数据: 代码如下: import java.awt.BorderLayout; import java. ...

  7. 用java写一个简易日历

    写一个简易日历 记录学习之路,用java语言,用的IDEA编辑器. 我觉得写日历一定要有两个首要方法,所以我首先先写了两个方法,一个是判断是否是闰年,方法代码如下 static boolean jud ...

  8. 用java制作一个简易抽签器

    最近闲来无事,想用Java编写一个随机抽签器,最终编写后的运行结果是这样的 下面说一下怎么具体实现,非常简单. 首先,要想出现这个滚动标签,首先必须要有一个窗口来承载它,所以要在main()方法中创建 ...

  9. 如何用Java写一个斗地主(一)

    如何用Java写一个斗地主(一) 序言 正文 创建卡牌 打乱牌序 发牌 课后吐槽 序言 作为一名大三的普普通通大学生,被实习老师(?)强迫下,第一次开始写CSDN的博客,如果写的不好,请多多包涵咯. ...

最新文章

  1. 2018.4.13 用java配置/生成Xml文件 结合IO流知识点
  2. 监控Tomcat解决方案(监控应用服务器系列文章分享)
  3. python将object转换为float_将pandas系列类型从object转换为float64
  4. 今晚8点,Oracle ACE男神Roger详解Oracle中为什么没有double write?
  5. Docker学习总结(55)——Google和Facebook为什么不用Docker?
  6. PHP开源的项目管理软件
  7. C#指南,重温基础,展望远方!(5)C#语句
  8. 去掉input回车自动提交
  9. 如何手动从Exchange2007/1010边缘/集线器传输服务器卸载ScanMail for Exchange(SMEX10.0)程序...
  10. selenium.common.exceptions.WebDriverException: Message: Can't load the profile.
  11. PTP Precision Time Protocol精确时间协议 IEEE1588解决方案(含PTP和PPS)
  12. wsimport 直接处理wsdl接口
  13. cad剖切线的快捷键_CAD中剖面线如何画
  14. Unity URP中的Single-Pass到底是什么
  15. unity使用easy ar制作ar红包
  16. 密集预测任务的多任务学习(Multi-Task Learning)研究综述 - 网络结构篇(上)
  17. 编写python代码实现打开并登录网页、对网页进行点击、输入信息等操作
  18. ABAP总结之十一,Enhancement(5)--Field Exits
  19. 如何快速做一个HTML5移动播放器
  20. linux下udev详解

热门文章

  1. 三巨头共聚AAA:ICapsule没有错,LeCun看好自监督,Bengio谈注意力
  2. 在AI领域每月投资一次,全面解析腾讯的人工智能奇招
  3. 业界丨全球AI人才只有2万多,但仅3000人在求职
  4. linux的变量用法
  5. 集成学习(Bagging和AdaBoost和随机森林(random forest))
  6. 城市大脑的定义与理论基础综述
  7. FrostSulliven最新发布引领全球增长的60大技术
  8. 信息大脑如何从物理大脑中涌现?
  9. 对话“互联网先驱”:星际互联网究竟可不可行?
  10. 元学习—Meta Learning的兴起