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

零基础学Java(10)面向对象-使用LocalDate类完成日历设计前言在我们完成这个日历设计前,需要了解Java中的预定义类LocalDate的一些用法语法LocalDate.now()//2022-07-01会构造一个新对象,表示构造这个对象时的日期。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

在我们完成这个日历设计前,需要了解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 制作日历 {
    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 = 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()
构造一个表示当前日期的对象

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天的日期
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164790.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java卸载干净_win10系统java如何卸载_win10怎么把java卸载干净

    java卸载干净_win10系统java如何卸载_win10怎么把java卸载干净win10系统功能强大,在使用win10系统电脑过程中,经常需要对系统中一些不需要的java程序进行卸载,对于一些不熟悉win10系统电脑操作的用户来说,完全不知道win10系统java程序如何卸载,那么下面就由小编来给大家介绍一下win10系统java卸载详细教程。具体方法:方法一:1、单击开始菜单,选择【设置】按钮;2、打开设置会弹出windows设置,在弹出的窗口点击【应用】按钮;3、在右…

    2022年5月12日
    63
  • 工业大数据的价值体现_如何分析转型带来的价值

    工业大数据的价值体现_如何分析转型带来的价值工业视角的转变        如果说前三次工业革命分别从机械化、规模化、标准化、和自动化等方向大幅度地提高了生产力,那么第四次工业革命与前面三次最大的区别在于:不再以制造端的生产力需求为出发点,而是将客户端价值作为整个产业链的核心,改变以往的工业价值链从生产端向消费端、上游向下游推动的模式,从客户端的价值需求出发提供客制化的产品和服务,并以此作为整个产业链的共同目标使整个产业链的各个环节实现协同优…

    2022年9月27日
    4
  • R语言建立回归分析,并利用VIF查看共线性问题的例子「建议收藏」

    R语言建立回归分析,并利用VIF查看共线性问题的例子「建议收藏」使用R对内置longley数据集进行回归分析,如果以GNP.deflator作为因变量y,问这个数据集是否存在多重共线性问题?应该选择哪些变量参与回归?答:##查看longley的数据结构str(longley)##’data.frame’:  16obs.of  7variables:##  $GNP.deflator:num  8388.588

    2022年6月4日
    66
  • clion 2021.4.2激活码破解方法

    clion 2021.4.2激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    79
  • vue.js 添加 fastclick的支持

    vue.js 添加 fastclick的支持fastclick:处理移动端click事件300毫秒延迟1、兼容性iOS3及更高版本的移动SafariiOS5及更高版本的ChromeAndroid上的Chrome(ICS)OperaMobile11.5及以上版本Android2以来的Android浏览器PlayBookOS1及以上版本2、不应用FastClick的场景桌面浏览器;如果视口元标签中设置了width=

    2022年6月19日
    24
  • 怎样将生成的xml文件进行格式化

    怎样将生成的xml文件进行格式化最近有在项目中生成xml文件,但是生成之后的xml文件打开之后,是一坨,看起来真的不美观,要是能够格式化输出来就好了。这里说明一下,我使用DOM4J的方式生成的xmlpublicstaticv

    2022年7月1日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号