1. localDate转localDateTime (转到当天00:00:00 及 最晚时刻)

	LocalDate.now().atStartOfDay();
		// 其实调用了  LocalDateTime.of(localdate, localtime) 方法
		//要转到什么时候 指定localtime就好了
		// 例如转到当日最晚时间  需要注意的是 23:59:59.999999999 而不是23:59:59
	 LocalDateTime todayMaxTime = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);

2. 日期减法 (减数字 返回单位:日期)

	// 今天减去1天 加法则是 plusDays
	LocalDate yesterday = LocalDate.now().minusDays(1L)

	//  今天减去一个月 返回上个月的今天
	LocalDate lastMonthDay = LocalDate.now().minusMonths(1L); 

3. 日期减法 (日期减日期 返回单位:天)

	LocalDate yesterday = LocalDate.now().minusDays(1L);
	// math.abs是取绝对值 避免负数
	int day = Math.abs(LocalDate.now().until(yesterday , ChronoUnit.DAYS));

4. 日期比较大小

	LocalDate day1= LocalDate.now();
	LocalDate day2= LocalDate.now();

    int res = day1.compareTo(day2);
    // 如果 res = 0 那么说明日期相等

谨慎使用 compareTo , 它只能保证

当结果为0时,说明结果为等于 ;
结果小于0时,结果为小于;
结果大于0时,结果为大于

不保证返回什么数字 相差多少天
源码如下:

在这里插入图片描述

我的建议是忘了compareTo吧 ,使用封装了它的方法:

// 返回布尔值
day1.isEqual(day2);
day1.isAfter(day2);
day1.isBefore(day2);

5. 获取当月的第一天

	// 获取当前月的第一天
	LocalDate firstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()); 
	
	// 获取当前月的最后一天
	LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); 

6. LocalDateTime转long

	//  toEpochMilli() 指毫秒 转出来的long是13位  如果要转成秒 (10位) 使用的是 getEpochSecond
    long nowTime = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();

7. long转LocalDateTime

  	  long nowTime = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
	
		// 注意  ofEpochMilli 是纳秒 long 13位数,如果是10位数 使用 ofEpochSecond
	  Instant instant = Instant.ofEpochMilli(nowTime);
	        ZoneId zone = ZoneId.systemDefault();
	        return LocalDateTime.ofInstant(instant, zone);

8. long转TimeStamp

	// 和上面一样 注意毫秒和秒的区别
     long nowTime = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
     Timestamp nowTs = new Timestamp(nowTime);	

9. 日期除法(除以数字)的解决方案

除法这个表述其实不严谨,我们平常开发也肯定不会想到什么日期除法
只有在遇到了例如统计业务时 才可能会产生这种想法
我们拿具体的案例来说明吧:

10月1日-10月30日,我们需要返回能整除5的日期 10月1日 5日 10日 15日…

但是Localdate是没有除法的,这个时候我们不能陷入死区,应该转换思路 寻找其它的解决方案:

我们可以用一个list 将所有日期 按由小到大的顺序存入,这样就将日期的除法转换成了list.size()的除法。

// 伪代码 
list.size() == 30  / 6 (被除数)  =  5,

for 6(被除数) :
  5*0, // 下标为0
  5*1-1, //下标为4 (减一是因为数组下标从0开始)
  5*2-1 ,
  5*3-1 ,
  5*4-1,
  5*5-1,
  5*6-1

10. String转LocalDate

// 如果是标准的yyyy-MM-dd格式 则parse方法的第二个参数可以省略
LocalDate localDate = 
    LocalDate.parse("2023-02-22", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    

11. LocalDate转String

    LocalDate date = LocalDate.now();
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String dateStr = date.format(fmt);

	// 与String转LocalDate相似的 如果是标准的yyyy-MM-dd 可以直接用 toString()方法
	String date = LocalDate.now().toString();

12. LocalDateTime转ZonedDateTime

		// ZonedDateTime.of 第一个参数是 LocalDateTime,第二个参数是时区
		ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault());

13. ZonedDateTime转LocalDate

		LocalDate date = ZonedDateTime.now().toLocalDate();

14. ZonedDateTime获取今日零点时间

一般实际业务可能是为LocalDate转成的ZonedDateTime数据,要拿出来做比较

		ZonedDateTime todayStartTime = ZonedDateTime.now().with(LocalTime.MIN);

15. LocalDate/LocalDateTime转Date,Date转LocalDate/LocalDateTime

其实就是通过ZonedDateTime格式进行中转

  Date date = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());

  Date dateTime = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());

 
  Instant instant = new Date().toInstant();
  
  LocalDate localDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();

  LocalDateTime localDate = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐