前言

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

语法

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

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

  1. LocalDate.of(1999, 1, 1)

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

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

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

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

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

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

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

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

日历实战

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

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

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

步骤分解

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

  1. `LocalDate date = LocalDate.now();`

②获取当前的月份和日期

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

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

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

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

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

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

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

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

  1. while (date.getMonthValue() == month) {
  2. System.out.printf("%3d", date.getDayOfMonth());
  3. if (date.getDayOfMonth() == today)
  4. System.out.print("*");
  5. else
  6. System.out.print(" ");
  7. date = date.plusDays(1);
  8. if (date.getDayOfWeek().getValue() == 1)
  9. System.out.println();
  10. }

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

完整代码

  1. import java.time.DayOfWeek;
  2. import java.time.LocalDate;
  3. /**
  4. * @author JKC
  5. * @Description:
  6. * @date 2022/7/1 10:53
  7. */
  8. public class 制作日历 {
  9. public static void main(String[] args) {
  10. // 创建一个日期对象,并进行初始化
  11. LocalDate date = LocalDate.now();
  12. System.out.println(date);
  13. // 获取当前月份和日期
  14. int month = date.getMonthValue();
  15. int today = date.getDayOfMonth();
  16. // 将date设置为这个月的第一天,并得到这一天为星期几
  17. date = date.minusDays(today - 1);
  18. // 设置为DayOfWeek类型的对象。调用这个对象的getValue方法来得到星期几的一个数值
  19. DayOfWeek weekday = date.getDayOfWeek();
  20. int value = weekday.getValue(); // 1 = Monday 7 = Sunday
  21. System.out.println("Mon Tue Wed Thu Fri Sat Sun");
  22. for (int i = 1; i < value; i++)
  23. System.out.print(" ");
  24. while (date.getMonthValue() == month) {
  25. System.out.printf("%3d", date.getDayOfMonth());
  26. if (date.getDayOfMonth() == today)
  27. System.out.print("*");
  28. else
  29. System.out.print(" ");
  30. date = date.plusDays(1);
  31. if (date.getDayOfWeek().getValue() == 1)
  32. System.out.println();
  33. }
  34. if (date.getDayOfWeek().getValue() != 1)
  35. System.out.println();
  36. }
  37. }

结论

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

LocalDate API

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

零基础学Java(10)面向对象-使用LocalDate类完成日历设计的更多相关文章

  1. 零基础学Java(11)自定义类

    前言   之前的例子中,我们已经编写了一些简单的类.但是,那些类都只包含一个简单的main方法.现在来学习如何编写复杂应用程序所需要的那种主力类.通常这些类没有main方法,却有自己的实例字段和实例方 ...

  2. 零基础学Java第五节(面向对象一)

    本篇文章是<零基础学Java>专栏的第五篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 类与对象 在哲学体系中,可以分为主 ...

  3. 零基础学Java第六节(面向对象二)

    本篇文章是<零基础学Java>专栏的第六篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 继承 创建一个Person类 我们 ...

  4. 零基础学Java,PayPal技术专家手把手带你入门

    在最权威的 TIOBE 编程语言排名榜单上,Java 常年稳居第一,可以说是世界上应用最为广泛的一门语言. 同时,在微服务.云计算.大数据.Android App 开发等领域,Java 也是当之无愧的 ...

  5. 零基础学Java第四节(字符串相关类)

    本篇文章是<零基础学Java>专栏的第四篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! String 本文章首发于公众号[编程攻略] 在Java中,我们经 ...

  6. 零基础学Java第三节(基本输入输出)

    本篇文章是<零基础学Java>专栏的第三篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] Java程序的命令行参数 我们可以 ...

  7. 零基础学Java第二节(运算符、输入、选择流程控制)

    本篇文章是<零基础学Java>专栏的第二篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 第一章 运算符 1.1 算术运算符的概述和用法 运算符 对常量和变 ...

  8. 零基础学Java第一节(语法格式、数据类型)

    本篇文章是<零基础学Java>专栏的第一篇文章,从本篇文章开始,将会连更本专栏,带领大家将Java基础知识彻底学懂,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! ...

  9. 零基础学Java(1)初识Java程序

    前言 就国内来说,Java毫无疑问是后端语言中的No.1没有之一,所以今天我们也来0基础学习Java!!! Java的好处(针对测试工程师) 面试加分->涨薪 大多数公司服务端用的都是Java, ...

随机推荐

  1. FinOps for Kubernetes - 如何拆分 Kubernetes 成本

    本文独立博客阅读地址:https://thiscute.world/posts/finops-for-kubernetes/ 目录 云计算成本管控 Kubernetes 成本分析的难点 Kuberne ...

  2. go convert slice to struct

    Question: in golang how to convert slice to struct scene 1:use reflect convert slice to struct func ...

  3. position与float

    position:fixed/absolute和float的关系:元素设置position:absolute / fixed后,float属性是没有效果的.对于position: absolute元素 ...

  4. Django学习——ajax发送其他请求、上传文件(ajax和form两种方式)、ajax上传json格式、 Django内置序列化(了解)、分页器的使用

    1 ajax发送其他请求 1 写在form表单 submit和button会触发提交 <form action=""> </form> 注释 2 使用inp ...

  5. Map传参优雅检验,试试json schema validator

    背景 笔者目前所在团队的代码年代已久,早年规范缺失导致现在维护成本激增,举一个深恶痛疾的例子就是方法参数使用Map"一撸到底",说多了都是泪,我常常在团队内自嘲"咱硬是把 ...

  6. mybatis各阶段的详解

    1 本阶段的需要注意的几个点 1,首先是在核心配置文件里面的内容: 配置的顺序,不配则不用管,配则必须按顺序来!!!! properties?, settings?, typeAliases?, ty ...

  7. 890. Find and Replace Pattern - LeetCode

    Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["ab ...

  8. Java线程同步操作

    synchronized 作用于对象实例:对给定对象加锁,进入同步代码前要获得给定对象的锁. 作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁. 作用于静态方法:相当于对当前类加 ...

  9. unity---寻路导航

    寻路导航 1. 简单的寻路 先搭建出类似下面的结构 将你想作为障碍的物体放入一个空物体中 进入空物体点击Static,仅勾选 Navigation Static 即可 依次点击 Window-> ...

  10. final变量、方法与类

    学习内容: 一.final变量 1.设定为final的变量,其值不可被改变. 2.final定义的变量必须在声明时对其进行赋值操作. 3.final可以修饰对象.被修饰为final的对象,只能恒定指向 ...