Java(10)面向对象-使用LocalDate类完成日历设计

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

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

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

LocalDate.of(1999, 1, 1)

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

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

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

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

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 Sun
                  1*  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("*");
    else
        System.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 &#x5236;&#x4F5C;&#x65E5;&#x5386; {
    public static void main(String[] args) {
        // &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65E5;&#x671F;&#x5BF9;&#x8C61;&#xFF0C;&#x5E76;&#x8FDB;&#x884C;&#x521D;&#x59CB;&#x5316;
        LocalDate date = LocalDate.now();
        System.out.println(date);
        // &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x6708;&#x4EFD;&#x548C;&#x65E5;&#x671F;
        int month = date.getMonthValue();
        int today = date.getDayOfMonth();

        // &#x5C06;date&#x8BBE;&#x7F6E;&#x4E3A;&#x8FD9;&#x4E2A;&#x6708;&#x7684;&#x7B2C;&#x4E00;&#x5929;&#xFF0C;&#x5E76;&#x5F97;&#x5230;&#x8FD9;&#x4E00;&#x5929;&#x4E3A;&#x661F;&#x671F;&#x51E0;
        date = date.minusDays(today - 1);
        // &#x8BBE;&#x7F6E;&#x4E3A;DayOfWeek&#x7C7B;&#x578B;&#x7684;&#x5BF9;&#x8C61;&#x3002;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;getValue&#x65B9;&#x6CD5;&#x6765;&#x5F97;&#x5230;&#x661F;&#x671F;&#x51E0;&#x7684;&#x4E00;&#x4E2A;&#x6570;&#x503C;
        DayOfWeek weekday = date.getDayOfWeek();
        int value = weekday.getValue();  // 1 = Monday    7 = Sunday

        System.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("*");
            else
                System.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()
&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x8868;&#x793A;&#x5F53;&#x524D;&#x65E5;&#x671F;&#x7684;&#x5BF9;&#x8C61;

static LocalDate of(int year, int month, int day)
&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x8868;&#x793A;&#x7ED9;&#x5B9A;&#x65E5;&#x671F;&#x7684;&#x5BF9;&#x8C61;

int getYear()
int getMonthValue()
int getDayOfMonth()
&#x5F97;&#x5230;&#x5F53;&#x524D;&#x65E5;&#x671F;&#x7684;&#x5E74;&#x3001;&#x6708;&#x548C;&#x65E5;&#x3002;

DayOfWeek getDayOfWeek
&#x5F97;&#x5230;&#x5F53;&#x524D;&#x65E5;&#x671F;&#x662F;&#x661F;&#x671F;&#x51E0;&#xFF0C;&#x4F5C;&#x4E3A;DayOfWeek&#x7C7B;&#x7684;&#x4E00;&#x4E2A;&#x5B9E;&#x4F8B;&#x8FD4;&#x56DE;&#x3002;&#x8C03;&#x7528;getValue&#x6765;&#x5F97;&#x5230;1~7&#x4E4B;&#x95F4;&#x7684;&#x4E00;&#x4E2A;&#x6570;&#xFF0C;&#x8868;&#x793A;&#x8FD9;&#x662F;&#x661F;&#x671F;&#x51E0;&#xFF0C;1&#x8868;&#x793A;&#x661F;&#x671F;&#x4E00;&#xFF0C;7&#x8868;&#x793A;&#x661F;&#x671F;&#x65E5;

LocalDate plusDays(int n)
LocalDate minusDays(int n)
&#x751F;&#x6210;&#x5F53;&#x524D;&#x65E5;&#x671F;&#x4E4B;&#x540E;&#x6216;&#x4E4B;&#x524D;n&#x5929;&#x7684;&#x65E5;&#x671F;

Original: https://www.cnblogs.com/jiakecong/p/16427937.html
Author: Silent丿丶黑羽
Title: Java(10)面向对象-使用LocalDate类完成日历设计

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590058/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java简单的MVC登入代码

    一、web结构图 二、jsp(V) Created by IntelliJ IDEA. User: Administrator Date: 2020/12/6 0006 Time:…

    Java 2023年5月29日
    0126
  • 学习进度第二次报告

    学习课程以及部分学习知识总结: 我的目标计划: 通过学习CSS基础知识,准备对我之前写的一些网页进行精细修饰。然后再去B站以及CSDN等技术网站上 多找找关于网页修饰这一类的课程和…

    Java 2023年6月6日
    071
  • CentOS 下 MySQL 服务搭建

    卸载旧 MySQL 查看 rpm 包 rpm-qa | grep mysql 如果存在,使用如下命令卸载 rpm -e 查找是否存在 mysql 相关目录 find / -name…

    Java 2023年6月7日
    061
  • nginx只允许域名访问,禁止ip访问

    背景:为什么要禁止ip访问页面呢? 这样做是为了避免其他人把未备案的域名解析到自己的服务器IP,而导致服务器被断网,我们可以通过禁止使用ip访问的方法,防止此类事情的发生。 解决方…

    Java 2023年5月30日
    063
  • STC单片机控制28BYJ-48步进电机

    STC单片机4*4按键控制步进电机旋转 28BYJ-48型步进电机说明 * 四相永磁式的含义 28BYJ-48工作原理 让电机转起来 最简单的电机转动程序 电机转速缓慢的原因分析 …

    Java 2023年6月9日
    088
  • JavaWeb入门

    1.Web概念概述 JavaWeb:使用Java语言开发基于互联网的项目 1.1 软件架构 C/S:Client/Server 客户端、服务器端 在用户本地有一个客户端程序,在远程…

    Java 2023年6月6日
    080
  • Oracle在操作系统层面kill所有session的语句

    原理,通过kill连接对应的进程来kill所有session。执行命令如下: ps -ef | grep LOCAL=NO | grep -v grep | awk ‘…

    Java 2023年5月30日
    069
  • quartz框架(九)-JobRunShell

    上篇博文,博主讲了Listener相关的内容。本篇博文,博主将要详细介绍一下JobRunShell的功能。简单的来说,JobRunShell就是Job实例运行时所在的环境,也就是说…

    Java 2023年6月7日
    086
  • 前后端分离项目,如何解决跨域问题?

    跨域问题是前后端分离项目中非常常见的一个问题,举例来说,编程猫(codingmore)学习网站的前端服务跑在 8080 端口下,后端服务跑在 9002 端口下,那么前端在请求后端接…

    Java 2023年6月9日
    084
  • JAVA 上加密算法的实现用例

    MD5/SHA1,DSA,DESede/DES,Diffie-Hellman 的使用 单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密。 通常…

    Java 2023年5月29日
    091
  • synology drive client 连接失败

    添加路由映射,别管你的nas端口是多少,这玩意默认端口就是6690 Original: https://www.cnblogs.com/limumu/p/16385174.html…

    Java 2023年6月6日
    095
  • Android开发java.lang.Class里面的native方法实现类源代码-记录一下备用

    Android SDK里面的java.lang.Class有一些native方法,比如public native T newInstance()等等,它们的实现类对应art/run…

    Java 2023年5月29日
    083
  • 和朱晔一起复习Java并发(一):线程池

    和我之前的Spring系列文章一样,我们会以做一些Demo做实验的方式来复习一些知识点。本文我们先从Java并发中最最常用的线程池开始。 从一个线程池实验开始 首先我们写一个方法来…

    Java 2023年5月29日
    077
  • aspose java word 插入特殊字符

    遇到一个需求,要在word文档中插入一些符号,入下图所示: 参考:https://blog.csdn.net/qq_35192741/article/details/9849798…

    Java 2023年5月29日
    080
  • 好书推荐之《深入理解计算机系统》

    大佬推荐 首先推荐的是翻译版图书《深入理解计算机系统》,原书名为《Computer Systems A Programmer’s Perspective》。不过,这本书…

    Java 2023年6月15日
    087
  • 基于SpringBoot的在线教育系统【源码开源】【建议收藏】

    一个月爆肝一个基于SpringBoot的在线教育系统【源码开源】【建议收藏】 https://blog.csdn.net/mengchuan6666/article/details…

    Java 2023年5月30日
    0145
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球