好用的类/工具类-日期篇
前言
这是我在掘金的第一篇文章,思来想去,还是像随心情写一下作为一个工作刚两年的java菜鸡,在工作里滥竽充数的日常哈哈哈哈哈哈哈哈哈哈
让我们开始吧!
工作的第一年里,所有的开发,我基本都是能用if else解决的,全部清一色if,虽然我知道这是代码的坏味道 (手动狗头) 。但是人菜啊,if else能解决问题啊,有什么办法?来自底层初级java工程狮的呐喊!
日期处理
前一段时间,我亲爱的”业务“,有一个需求,涉及需要取出字不同日期之间的季度差(两个时间之间相差多少季度),月度差。
说实话,咱不会,我的脑子只停留在怎么把每个月转成数字进行运算,然后再什么 除以3 之类的操作转回季度。
但这样说真的,我都觉得的这个办法智障,还存在跨年的问题,for + if 这样的代码被看到我就露馅了,于是我默默去问了GPT...,果然,java早就给我提供好了方法,
当然,由于我们数据库存的日期是字符串类型,年份和月份分别存储为俩字段,还不是yyyy-MM的形式,咱还得先转成LocalDate的格式
字符类型日期 转指定格式日期
年份字段:2021 月份字段:7 ,咱得给他转成2021-07
// 填充月份的0
String monthStr = month.length() == 1 ? "0" + month : month;
String dateStr = year + "-" + monthStr;
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM").parseDefaulting(ChronoField.DAY_OF_MONTH, 1).toFormatter();
return LocalDate.parse(dateStr, formatter);
这里有意思的是,我之前使用
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
// 或者
DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyy-MM").toFormatter();
去构建转换器,是会转换失败的,具体原因网上看了一堆都是废话,总的来说就是需要转为LocalDateTime再转为DateTimeFormatter
也算是我一个疑惑了,暂且搁置一下 (能跑就行hhh)
ChronoUnit.between() 月份的差(算上年份)
ChronoUnit是Java 8中的一个枚举类型,用于表示时间单位。它包含了所有基本的时间单位,例如年、月、日、小时、分钟等
其中还提供了几个方法,比如这里的between(),算两个日期之间相差多少天或多少小时
LocalDate targetDate
LocalDate beginDate = LocalDate.parse(String 类型的日期);
long MonthBetween = ChronoUnit.MONTHS.between(beginDate, targetDate);
计算日期之间的季度差(算上跨年)
回到最后的计算日期之间的季度差,这个java好像没之间使用的API,但是已经可以计算出月度差,就可以之间包装成季度了
这个相对就麻烦一点了,需要先获取到当前季度对应的日期,然后使用ChronoUnit.between()计算月份差,最后将其转换为相差多少个季度
-
首先,获取这两个日期所在的年份和季度。
YearQuarter是个获取季度的方法,指定年月日获取季度,这里是用来显示季度信息的有日期可以直接用日期
LocalDate date1 = LocalDate.of(2022, 3, 15);
LocalDate date2 = LocalDate.of(2023, 8, 20);
YearQuarter q1 = YearQuarter.from(date1);
YearQuarter q2 = YearQuarter.from(date2);
上述代码中,我们分别创建了两个LocalDate对象:date1代表2022年第一季度中的某一天,date2代表2023年第三季度中的某一天。然后通过调用它们对应的YearQuarter.from()方法获取它们所在的年份和季度。
注意,在判断跨年情况时,需要将这些日期转换为对应的年份和季度进行比较。
- 然后,计算这两个日期之间相差多少个月,并将其转换为相差多少个季度。
long monthsBetween = ChronoUnit.MONTHS.between(date1.withDayOfMonth(1), date2.withDayOfMonth(1));
// 月份差变为季度差
int quartersBetween = (int) Math.floor(monthsBetween / 3.=0);
ChronoUnit.MONTHS.between()方法计算这两个日期之间相差多少个月(注意要将每一个月都设置成该月第一天)。
然后将其除以3并向下取整即可得到相差多少个季度。
其实总的来说,只介绍了一个API:
ChronoUnit.MONTHS.between(),但是延伸出不同的用法,都可以再后续开发直接使用,快乐摸鱼以上需求直接一步到位,代码一下就简洁了起来,我又可以继续充数了
结尾
先写这几个,该干饭了,后面有了我继续更新...