Java LocalDate类使用总结

一、背景分析

Java中1.8之前涉及到时间的定义或者计算,我们常使用Date和Calendar类来完成。
1、Date类到了1.8大部分的方法被弃用了,而且date格式可读性特别差,我们往往需要去格式化,而格式化使用simpledateformat来进行操作线程不安全,simpledateformat方法中format和parse方法都是线程不安全的。
​​​​​​​​在这里插入图片描述
2、Calendar类是一个共享变量,多个线程会同时调用calendar.setTime方法也会导致时间一直被修改从而返回错误的时间。

基于这些安全问题的考虑,Java1.8之后出现了localdate,localdatetime,localtime类,而这些类使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,这些类都是线程安全的。

二、功能介绍

1、区别 :localdate是针对于年月日的,localtime是针对于时分秒,localdatetime是针对于年月日时分秒

2、初始化

	/**
     * 获取当前时间
     */
    @Test
    public void localDateCreate() {
        LocalDate yyyyMMdd = LocalDate.now();
        LocalTime HHmmssSSS = LocalTime.now();
        LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.now();
        System.out.println("年月日: " + yyyyMMdd);
        System.out.println("时分秒毫秒: " + HHmmssSSS);
        System.out.println("年月日时分秒毫秒: " + yyyyMMddHHmmssSSS);
        //输出:
        //        年月日: 2020-10-16
        //        时分秒毫秒: 09:55:49.448
        //        年月日时分秒毫秒: 2020-10-16T09:55:49.448
    }

3、自定义

	/**
     * localDate 设值自定义日期
     * 根据指定日期/时间创建对象
     */
    @Test
    public void setDate() {
        LocalDate yyyyMMdd = LocalDate.of(2020, 10, 15); //2020-10-15
        LocalTime HHmmssSSS = LocalTime.of(10, 10, 10); //10:10:10
        LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.of(2020, 10, 15, 10, 10);  //2020-10-15T10:10
        LocalDate directDesignationYear = yyyyMMdd.withYear(2000);
        System.out.println("LocalDate 指定年份: " + directDesignationYear);
        LocalDate directDesignationMonth = yyyyMMdd.withMonth(6);
        System.out.println("LocalDate 指定月份: " + directDesignationMonth);    
        LocalDate directDesignationYearDate = yyyyMMdd.withDayOfYear(20);
        System.out.println("LocalDate 指定到当年第几天: " + directDesignationYearDate);  
        LocalDate directDesignationDate = yyyyMMdd.withDayOfMonth(20);
        System.out.println("LocalDate 指定到当月几号: " + directDesignationDate);
    }

4、计算

	/**
     * 日期时间的加减
     */
    @Test
    public void lessOrAddDate() {
        LocalDate yyyyMMdd = LocalDate.now();
        LocalDate addOneDay = yyyyMMdd.plusDays(1L); //添加一日
        LocalDate addOneMonths = yyyyMMdd.plusMonths(1L);//添加一月
        LocalDate addOneYears = yyyyMMdd.plusYears(1L);//添加一年
        LocalDate addOneWeeks = yyyyMMdd.plusWeeks(1L);//添加一周
        LocalDate delOneDay = yyyyMMdd.minusDays(1L); //减去一日
        LocalDate delOneMonths = yyyyMMdd.minusMonths(1L);//减去一月
        LocalDate delOneYears = yyyyMMdd.minusYears(1L);//减去一年
        LocalDate delOneWeeks = yyyyMMdd.minusWeeks(1L);//减去一周
        -------------------------------------------------------------
        LocalTime HHmmssSSS = LocalTime.now();
        LocalTime addOneHours = HHmmssSSS.plusHours(1L); //添加1小时
        LocalTime addOneMinutes = HHmmssSSS.plusMinutes(1L);//添加1分钟
        LocalTime addOneSeconds = HHmmssSSS.plusSeconds(1L);//添加1秒
        LocalTime addOneNanos = HHmmssSSS.plusNanos(1L);//添加1纳秒
        LocalTime delOneHours = HHmmssSSS.minusHours(1L); //减去1小时
        LocalTime delOneMinutes = HHmmssSSS.minusMinutes(1L);//减去1分钟
        LocalTime delOneSeconds = HHmmssSSS.minusSeconds(1L);//减去1秒
        LocalTime delOneNanos = HHmmssSSS.minusNanos(1L);//减去1纳秒
        -------------------------------------------------------------
        LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.now();
        LocalDateTime localDateTimeaddOneDay = yyyyMMddHHmmssSSS.plusDays(1L); //添加一日
        LocalDateTime localDateTimeaddOneMonths = yyyyMMddHHmmssSSS.plusMonths(1L);//添加一月
        LocalDateTime localDateTimeaddOneYears = yyyyMMddHHmmssSSS.plusYears(1L);//添加一年
        LocalDateTime localDateTimeaddOneWeeks = yyyyMMddHHmmssSSS.plusWeeks(1L);//添加一周
        LocalDateTime localDateTimeaddOneHours = yyyyMMddHHmmssSSS.plusHours(1L); //添加1小时
        LocalDateTime localDateTimeaddOneMinutes =yyyyMMddHHmmssSSS.plusMinutes(1L);//添加1分钟
        LocalDateTime localDateTimeaddOneSeconds = yyyyMMddHHmmssSSS.plusSeconds(1L);//添加1秒
        LocalDateTime localDateTimeaddOneNanos = yyyyMMddHHmmssSSS.plusNanos(1L);//添加1纳秒
        LocalDateTime localDateTimedelOneDay = yyyyMMddHHmmssSSS.minusDays(1L); //减去一日
        LocalDateTime localDateTimedelOneMonths = yyyyMMddHHmmssSSS.minusMonths(1L);//减去一月
        LocalDateTime localDateTimedelOneYears = yyyyMMddHHmmssSSS.minusYears(1L);//减去一年
        LocalDateTime localDateTimedelOneWeeks = yyyyMMddHHmmssSSS.minusWeeks(1L);//减去一周
        LocalDateTime localDateTimedelOneHours = yyyyMMddHHmmssSSS.minusHours(1L); //减去1小时
        LocalDateTime localDateTimedelOneMinutes=yyyyMMddHHmmssSSS.minusMinutes(1L);//减去1分钟
        LocalDateTime localDateTimedelOneSeconds = yyyyMMddHHmmssSSS.minusSeconds(1L);//减去1秒
        LocalDateTime localDateTimedelOneNanos = yyyyMMddHHmmssSSS.minusNanos(1L);//减去1纳秒
    }

5、获取日期的年月日周时分秒

    public void getDateInfo() {
        LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.now();
        //本年当中第多少天
        int dayOfYear = yyyyMMddHHmmssSSS.getDayOfYear();//310
        //本月当中第多少天
        int dayOfMonth = yyyyMMddHHmmssSSS.getDayOfMonth();//5
        //英文
        DayOfWeek dayOfWeek = yyyyMMddHHmmssSSS.getDayOfWeek();//TUESDAY
        //本周中星期几
        int value = dayOfWeek.getValue();//2
		//今天是2024-11-05T10:33:41.955
		//本年当中第310天
		//本月当中第5天
		//本周中星期2-即TUESDAY
 
        //年
        int year = yyyyMMddHHmmssSSS.getYear();
        //月
        Month month = yyyyMMddHHmmssSSS.getMonth();
        //或直接获取
        int monthValue = yyyyMMddHHmmssSSS.getMonthValue();
        //日
        int dayOfMonth1 = yyyyMMddHHmmssSSS.getDayOfMonth();
        //时
        int hour = yyyyMMddHHmmssSSS.getHour();
        //分
        int minute = yyyyMMddHHmmssSSS.getMinute();
        //秒
        int second = yyyyMMddHHmmssSSS.getSecond();
        //纳秒
        int nano = yyyyMMddHHmmssSSS.getNano();
    }

6、时间的比较与判断

    public void compare() {
        LocalDate now = LocalDate.now();
        LocalDate of = LocalDate.of(2020, 10, 15);
        //判断of 是否在 now 时间之前
        boolean before = of.isBefore(now);//true
        //判断of 是否在 now 时间之后
        boolean after = of.isAfter(now);//false
        //判断两个时间是否相等
        boolean equal = of.isEqual(now);//false
        //判断是否为闰年
        boolean leapYear = now.isLeapYear();//false
        
    }

7、计算时间、日期间隔

    public void durationOrPeriod() {
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime of = LocalDateTime.of(2020, 10, 15, 10, 24);
        //Duration:用于计算两个“时间”间隔
        Duration duration = Duration.between(now, of);
        System.out.println(now + " 与 " + of + " 间隔  " + "\n"
                + " 天 :" + duration.toDays() + "\n"
                + " 时 :" + duration.toHours() + "\n"
                + " 分 :" + duration.toMinutes() + "\n"
                + " 毫秒 :" + duration.toMillis() + "\n"
                + " 纳秒 :" + duration.toNanos() + "\n"
        );
 
        //Period:用于计算两个“日期”间隔
        Period period = Period.between(nowDate, OfDate);
        System.out.println("Period相差年数 : " + period.getYears());
        System.out.println("Period相差月数 : " + period.getMonths());
        System.out.println("Period相差日数 : " + period.getDays());
        //还可以这样获取相差的年月日
        System.out.println("-------------------------------");
        long years = period.get(ChronoUnit.YEARS);
        long months = period.get(ChronoUnit.MONTHS);
        long days = period.get(ChronoUnit.DAYS);
        System.out.println("Period相差的年月日分别为 : " + years + "," + months + "," + days);
        //注意,当获取两个日期的间隔时,并不是单纯的年月日对应的数字相加减,而是会先算出具体差多少天,在折算成相差几年几月几日的
    }

8、日期格式化

    @Test
    public void formatter1() {
    	//将时间对象转化为日期字符串
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS");
        String format = dtf.format(now);
        System.out.println(format);
        //输出: 2020-10-16 14:41:01:086
		
		//字符串对象转为格式化后的时间日期对象
	    String dateStr = "2020-11-12";
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate formatterDate = LocalDate.parse(dateStr, dtf);
        System.out.println(formatterDate);
        //输出 2020-11-12
  }

9、日期之间的转换

	/**
     * localDate 转 date
     * localDateTime 转 date
     */
    @Test
    public void localDateToDate() {
    
       //localDate 转 date
        LocalDate now = LocalDate.now();
        Date from = Date.from(now.atStartOfDay(ZoneOffset.systemDefault()).toInstant());
        //localDateTime 转 date
        LocalDateTime localDateTime = LocalDateTime.now();
        Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
        
        //date 转 localDate 
		Date date = new Date();
        LocalDate localDate =date.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDate();
        //date 转 localDateTime 
        LocalDateTime localDateTime = date.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDateTime();

		//LocalDate 转 时间戳
		LocalDate localDate = LocalDate.now();
	    long instant = localDate.atStartOfDay(ZoneOffset.systemDefault()).toInstant().toEpochMilli();
		//LocalDateTime 转 时间戳
	 	LocalDateTime now = LocalDateTime.now();
        long instant1 = now.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
		//时间戳 转 LocalDate
		long time = new Date().getTime();
        LocalDateTime localDateTime = 			Instant.ofEpochMilli(time).atZone(ZoneOffset.systemDefault()).toLocalDateTime();
		//时间戳 转 LocalDateTime
		 LocalDate localDate = Instant.ofEpochMilli(time).atZone(ZoneOffset.systemDefault()).toLocalDate();
 }

### Java LocalDate 的用法和示例 `LocalDate` 是 Java 8 中引入的一个重要,属于 `java.time` 包的一部分。它主要用于表示不带时间部分的日期(年、月、日)。以下是关于 `LocalDate` 的一些核心功能以及如何使用的例子。 #### 创建 LocalDate 实例 可以通过多种方式创建 `LocalDate` 对象: 1. **当前日期** 使用静态方法 `now()` 可以获取当前系统的日期。 ```java LocalDate today = LocalDate.now(); System.out.println(today); ``` 2. **指定日期** 使用 `of(year, month, day)` 方法可以创建特定日期的对象。 ```java LocalDate specificDate = LocalDate.of(2023, 10, 5); System.out.println(specificDate); // 输出:2023-10-05 ``` 3. **解析字符串** 如果有一个日期格式的字符串,可以直接通过 `parse(String date)` 方法将其转换为 `LocalDate`。 ```java LocalDate parsedDate = LocalDate.parse("2023-10-05"); System.out.println(parsedDate); // 输出:2023-10-05 ``` #### 获取日期中的具体信息 `LocalDate` 提供了许多便捷的方法来访问其内部存储的信息: ```java int year = today.getYear(); // 当前年的数值 Month month = today.getMonth(); // 返回 Month 枚举对象 int dayOfMonth = today.getDayOfMonth(); // 日的部分 DayOfWeek dow = today.getDayOfWeek(); // 星期几 long epochDay = today.toEpochDay(); // 自公元纪元以来的天数 System.out.println("Year: " + year + ", Month: " + month + ", Day: " + dayOfMonth + ", DOW: " + dow + ", Epoch Day: " + epochDay); ``` #### 修改日期 虽然 `LocalDate` 是不可变的,但它提供了许多方法返回修改后的副本: ```java // 加减操作 LocalDate nextWeek = today.plusDays(7); // 增加七天 LocalDate lastYear = today.minusYears(1); // 减少一年 // 替换单个字段 LocalDate modifiedDate = today.withYear(2025).withMonth(Month.DECEMBER.getValue()).withDayOfMonth(25); System.out.println(modifiedDate); // 输出:2025-12-25 ``` #### 判断日期关系 可以比较两个 `LocalDate` 是否相等或者判断它们的时间顺序: ```java boolean isEqual = today.isEqual(LocalDate.now()); // 检查是否相同 boolean isBefore = today.isBefore(LocalDate.of(2024, 1, 1)); // 检查今天是否早于某个日期 boolean isAfter = today.isAfter(LocalDate.of(2022, 1, 1)); // 检查今天是否晚于某个日期 ``` #### 处理异常情况 如果尝试创建非法的日期组合,则会抛出运行时异常 `DateTimeException`[^3]。例如: ```java try { LocalDate invalidDate = LocalDate.of(2023, 2, 30); // 非法日期 } catch (DateTimeException e) { System.out.println(e.getMessage()); } ``` --- ### 示例代码综合展示 以下是一个完整的示例程序,展示了上述提到的功能: ```java import java.time.LocalDate; import java.time.Month; public class LocalDateExample { public static void main(String[] args) { // 获取今天的日期 LocalDate today = LocalDate.now(); System.out.println("Today's Date: " + today); // 创建特定日期 LocalDate specificDate = LocalDate.of(2023, Month.OCTOBER, 5); System.out.println("Specific Date: " + specificDate); // 解析日期字符串 LocalDate parsedDate = LocalDate.parse("2023-10-05"); System.out.println("Parsed Date: " + parsedDate); // 访问日期组件 int year = today.getYear(); Month month = today.getMonth(); int day = today.getDayOfMonth(); System.out.println("Year: " + year + ", Month: " + month + ", Day: " + day); // 修改日期 LocalDate nextWeek = today.plusDays(7); System.out.println("Next Week: " + nextWeek); // 替换日期字段 LocalDate christmas2025 = today.withYear(2025).withMonth(Month.DECEMBER.getValue()).withDayOfMonth(25); System.out.println("Christmas 2025: " + christmas2025); // 比较日期 boolean isFuture = today.isAfter(LocalDate.of(2022, 1, 1)); System.out.println("Is Today After Jan 1, 2022? " + isFuture); try { // 尝试创建非法日期 LocalDate invalidDate = LocalDate.of(2023, 2, 30); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); } } } ``` --- ### 总结 `LocalDate` 的设计充分体现了现代 API 的简洁性和功能性。它的不可变特性使得线程安全得以保障,而丰富的内置方法则极大地简化了开发者处理日期逻辑的工作量[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值