文章目录
- 1. localDate转localDateTime (转到当天00:00:00 及 最晚时刻)
- 2. 日期减法 (减数字 返回单位:日期)
- 3. 日期减法 (日期减日期 返回单位:天)
- 4. 日期比较大小
- 5. 获取当月的第一天
- 6. LocalDateTime转long
- 7. long转LocalDateTime
- 8. long转TimeStamp
- 9. 日期除法(除以数字)的解决方案
- 10. String转LocalDate
- 11. LocalDate转String
- 12. LocalDateTime转ZonedDateTime
- 13. ZonedDateTime转LocalDate
- 14. ZonedDateTime获取今日零点时间
- 15. LocalDate/LocalDateTime转Date,Date转LocalDate/LocalDateTime
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();