前言

在我们完成这个日历设计前,需要了解Java中的预定义类 LocalDate 的一些用法

语法

LocalDate.now() // 2022-07-01

会构造一个新对象,表示构造这个对象时的日期。

LocalDate.of(1999, 1, 1)

可以提供年、月和日来构造对应一个特定日期的对象:

当然,通常我们都希望将构造的对象保存在一个对象变量中:

LocalDate newYearsEve = LocalDate.of(1999, 1, 1);

当有了一个 LocalDate 对象,可以用方法 getYear 、 getMonthValue 和 getDayOfMonth 得到年、月和日:

int year = newYearsEve.getYear(); // 1999
int month = newYearsEve.getMonthValue(); // 1
int day = newYeaersEve.getDayOfMonth(); // 1

上面的方法看起来没什么意义,因为这正是构造对象时使用的那些值。不过,有时可能有一个计算得到的日期,然后你希望调用这些方法来了解它的更多信息。例如, plusDays 方法会得到一个新的 LocalDate ,如果把应用这个方法的对象称为当前对象,这个新日期对象则是距当前对象指定天数的一个新日期:

LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);
year = aThousandDaysLater.getYear();  // 2002
month = aThousandDaysLater.getMonthValue();  // 09
day = aThousandDaysLater.getDayOfMonth();  // 26

aThousandDaysLater 是在原来的日期上加了1000天,这时使用上面的方法就有效了

日历实战

需求:使用 LocalDate 类展示当前月的日历,格式如下:

Mon Tue Wed Thu Fri Sat Sun1*  2   3 4   5   6   7   8   9  10 11  12  13  14  15  16  17 18  19  20  21  22  23  24 25  26  27  28  29  30  31

当前日期使用 * 号标记。可以看到,这个程序需要知道如何计算某月份的天数以及一个给定日期相应是星期几。

步骤分解

①先构造一个对象,并用当前的日期初始化

LocalDate date = LocalDate.now();`

②获取当前的月份和日期

int month = date.getMonthValue();
int today = date.getDayOfMonth();

③将date设置为这个月的第一天,并得到这一天为星期几

date = date.minusDays(today - 1);  // 设置为当月的第一天
DayOfWeek weekday = date.getDayOfWeek();
int value = weekday.getValue();  // 1 = Monday    7 = Sunday

变量 weekday 设置为 DayOfWeek 类型的对象。我们调用这个对象的 getValue 方法来得到星期几的一个数值。我们会得到一个整数。星期一就返回1,星期二就返回2,依次类推,星期日就返回7.

④由于日历的第一行是缩进的,这样可使月份的第一天指向相应的星期几。下面代码会打印表头和第一行的缩进

System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for (int i = 1; i < value; i++)System.out.print("    ");

⑤打印日历的主体,进入一个循环,其中date遍历一个月中的每一天。

每次迭代时,打印日期值。如果date是当前日期,这个日期则用一个 * 标记。接下来,把date推进到下一天。如果到达新的一周的第一天,则换行打印:

while (date.getMonthValue() == month) {System.out.printf("%3d", date.getDayOfMonth());if (date.getDayOfMonth() == today)System.out.print("*");elseSystem.out.print(" ");date = date.plusDays(1);if (date.getDayOfWeek().getValue() == 1)System.out.println();
}

⑥什么时候结束呢?我们不知道这个月有几天,是28、29、30还是31。实际上,只要date还在当月就要继续迭代

完整代码

import java.time.DayOfWeek;
import java.time.LocalDate;/*** @author JKC* @Description:* @date 2022/7/1 10:53*/
public class 制作日历 {public static void main(String[] args) {// 创建一个日期对象,并进行初始化LocalDate date = LocalDate.now();System.out.println(date);// 获取当前月份和日期int month = date.getMonthValue();int today = date.getDayOfMonth();// 将date设置为这个月的第一天,并得到这一天为星期几date = date.minusDays(today - 1);// 设置为DayOfWeek类型的对象。调用这个对象的getValue方法来得到星期几的一个数值DayOfWeek weekday = date.getDayOfWeek();int value = weekday.getValue();  // 1 = Monday    7 = SundaySystem.out.println("Mon Tue Wed Thu Fri Sat Sun");for (int i = 1; i < value; i++)System.out.print("    ");while (date.getMonthValue() == month) {System.out.printf("%3d", date.getDayOfMonth());if (date.getDayOfMonth() == today)System.out.print("*");elseSystem.out.print(" ");date = date.plusDays(1);if (date.getDayOfWeek().getValue() == 1)System.out.println();}if (date.getDayOfWeek().getValue() != 1)System.out.println();}
}

结论

上面的示例程序的重点是展示如何使用一个类的接口完成相当复杂的任务,而无须了解实现细节

LocalDate API

static LocalDate now()
构造一个表示当前日期的对象static LocalDate of(int year, int month, int day)
构造一个表示给定日期的对象int getYear()
int getMonthValue()
int getDayOfMonth()
得到当前日期的年、月和日。DayOfWeek getDayOfWeek
得到当前日期是星期几,作为DayOfWeek类的一个实例返回。调用getValue来得到1~7之间的一个数,表示这是星期几,1表示星期一,7表示星期日LocalDate plusDays(int n)
LocalDate minusDays(int n)
生成当前日期之后或之前n天的日期

使用LocalDate类完成日历设计相关推荐

  1. java 打印 日历 详细 注解_Java类库 LocalDate类的简单使用(一)之打印本月的日历...

    Java类库的设计者将保存时间与给时间点命名分开.所以标准Java类库分别包含了两个类:一个是用来表示时间点的Date类:另一个是用来表示日历表示法的LocalDate类.这里简单分析了LocalDa ...

  2. java中的localDate类_java8-LocalDate类

    LocalDate类使用ISO日历表示年.月.日. LocalDate.now(); 获取系统当前日期 LocalDate.of(int year,int month,int dayOfMonth); ...

  3. Java LocalDate类| isLeapYear()方法与示例

    LocalDate类isLeapYear()方法 (LocalDate Class isLeapYear() method) isLeapYear() method is available in j ...

  4. 最佳运动类APP-Keep原型设计与欣赏

    运动类APP是大家手机中必备的一款软件.如果说谁手机里没有任何涉及运动类APP,那只能说真的与时代脱轨了.近些年随着物质生活条件的改善,人们开始越来越重视自己的身体,所以也越来越多的人会进行身体锻炼. ...

  5. java中的localDate类,Java LocalDate类

    本文概述 Java LocalDate类是一个不可变的类, 它以默认格式yyyy-MM-dd表示Date.它继承了Object类并实现了ChronoLocalDate接口 Java LocalDate ...

  6. Date类和LocalDate类的使用

    Java中有一个特殊的用来表示时间点的类Date,还有一个以日历表示法表示日期的类LocalDate,相比于其他类我们使用较少,但日期时间的使用之处还是很多的,我们也需要熟练掌握这两个类. Date类 ...

  7. Java中日期处理--LocalDate类

    文章目录 0 写在前面 1 介绍 2 举例 3 写在后面 0 写在前面 Java中存在一个日历表示法的类库–>LocalDate类. 如果只想要指定的年月日就可以用这个LocalDate类. 1 ...

  8. Atitit.java c#这类编程语言的设计失败点attilax总结

    Atitit.java c#这类编程语言的设计失败点attilax总结 1. Npe1 2. Api粒度过小而又没有提供最常用模式1 3. checked exception(jeig n jyejy ...

  9. JDK8中好用的日期处理-LocalDate类-LocalTime-LocalDateTIme,mysql解决时区相差13小时的问题,日期格式器DateTimeFormatter

    JDK8中好用的日期处理-LocalDate类-LocalTime-LocalDateTIme,mysql解决时区相差13小时的问题,日期格式器DateTimeFormatter 参考文章: (1)J ...

最新文章

  1. VLC SDK在VS2010中的配置及简单使用举例
  2. 利用基于GPU的AI模拟一个现实宇宙 仅需36分钟
  3. redis 通过aof日志恢复_宕机了,宕机了,Redis数据丢了怎么办?
  4. ZooKeeper原理及使用
  5. linux系统切换用户
  6. html线框聚焦效果,24种表单input输入框聚焦动画特效
  7. 利用helloworld来检测VPS的对外端口是否打开
  8. 浅谈Handler机制
  9. redis---中文文档
  10. Atitit.研发管理如何避免公司破产倒闭的业务魔咒
  11. 计算机专业个人职业规划范文200字,计算机专业的职业生涯规划范文
  12. 【经典算法实现 42】二维傅里叶变换 及 逆变换代码实现
  13. 基于ThinkPHP6+Layui的后台管理框架
  14. 万字长文!多图预警!46张图彻底搞懂 IP 基础知识!
  15. 你开奖了吗?细数大厂春节红包背后的技术支撑
  16. arm板发热和功耗探讨
  17. android仿qq聊天界面版带表情、相册、照相
  18. OBS (open boardcast server)结构分析
  19. Proteus——测量脉冲频率
  20. /etc/sysconfig/目录详解

热门文章

  1. 12306火车票订票项目源码
  2. Vue打包部署到Tomcat
  3. 远征Online装备系统分析
  4. java的详细安装步骤讲解
  5. RK3399平台开发系列讲解(USB设备驱动)5.29、USB Type C结构图
  6. 苹果x微信语音十秒就断_微信朋友圈,能用图片和语音评论了!安卓苹果都可以!...
  7. Mac M1 配置初始化 Nginx+PHP+MySQL环境
  8. 树莓派设备喷墨打印机定时打印
  9. java ee简介_JavaEE简介
  10. ch4-数据库安全性