在日常开发中,我们难免会跟日期打交道,有很多时候我们要对相关的日期进行处理。我们就需要根据需求需要来对日期做对应的处理。
在我的一次开发中,有一个需求是我需要计算一个设备的使用寿命,不满一年按一年算,满一年不满两年按两年算。简简单单几个字的需求,我也是仔细思考了一下怎么写,不过由于有了ChatGPT,我便试着向它提出问题,给我一套代码解决方案,然后结果并没有让我满意,我在验证的过程中发现并不能完美实现,会有边界的问题。我先贴出gpt给的代码:这里我使用的是poe.com 这个需要魔法使用的工具,我感觉挺好用的,只需要魔法和登录账号就行,回答问题速度很快。
import java.time.LocalDate;
import java.time.Period;
/**
* 方法一
*/
public class DateDiff {
public static int getYearDiff(LocalDate date1, LocalDate date2) {
Period period = Period.between(date1, date2);
int yearDiff = period.getYears();
if (period.getMonths() > 0 || period.getDays() > 0) {
yearDiff++;
}
if (yearDiff == 0) {
yearDiff = 1;
} else if (yearDiff == 1) {
LocalDate nextYear = date1.plusYears(1);
if (nextYear.isBefore(date2) || nextYear.isEqual(date2)) {
yearDiff++;
}
}
return yearDiff;
}
}
//方法一demo示例,由gpt提供
import java.time.LocalDate;
public class DateDiffTest {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2020, 3, 1);
LocalDate date2 = LocalDate.of(2021, 2, 28);
int yearDiff = DateDiff.getYearDiff(date1, date2);
System.out.println(yearDiff); // 输出2
LocalDate date3 = LocalDate.of(2020, 3, 1);
LocalDate date4 = LocalDate.of(2020, 12, 31);
yearDiff = DateDiff.getYearDiff(date3, date4);
System.out.println(yearDiff); // 输出1
}
}
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* 方法二
*/
public class StringDateDiff {
public static int getYearDiff(String strDate1, String strDate2) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date1 = LocalDate.parse(strDate1, formatter);
LocalDate date2 = LocalDate.parse(strDate2, formatter);
return DateDiff.getYearDiff(date1, date2);
}
}
//方法二demo示例,由gpt提供
public class StringDateDiffTest {
public static void main(String[] args) {
String strDate1 = "2020-03-01";
String strDate2 = "2021-02-28";
int yearDiff = StringDateDiff.getYearDiff(strDate1, strDate2);
System.out.println(yearDiff); // 输出2
String strDate3 = "2020-03-01";
String strDate4 = "2020-12-31";
yearDiff = StringDateDiff.getYearDiff(strDate3, strDate4);
System.out.println(yearDiff); // 输出1
}
}
其实我看到代码的demo示例结果后,我就自己去写了,由于自己的技能比较笨拙,所以大佬勿喷,对我来说能run就行哈哈哈哈。代码如下:
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
private static final SimpleDateFormat sdf2 = new SimpleDateFormat("MMdd");
private static final SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd");
/**
* 根据新旧日期字符串计算两者所差年份
* @param old 旧日期 2022-03-30
* @param now 最新的日期 2023-03-20
* @return 不满一年算一年,一年多算两年
*/
private static Long computeYear(String old,String now){
try {
Date oldDate = sdf.parse(old);
Date nowDate = sdf.parse(now);
long a = Long.parseLong(sdf.format(nowDate))-Long.parseLong(sdf.format(oldDate));
if (equalsLarge(old,now)){
a= a+1;
}
return a;
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 比较日期大小,用来判断是否需要对年份进行+1
* 这里是将日期字符串转成int类型来进行比较大小,如0330 和0320 比较
*/
private static Boolean equalsLarge(String old,String now){
try {
return Long.parseLong(sdf2.format(sdf3.parse(now))) > Long.parseLong(sdf2.format(sdf3.parse(old)));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
我这里的新日期和旧日期传值不能出错,当然如果你不知道自己的两个日期哪个比较新的话可以在调用computeYear方法前通过Date.getTime()方法去判断比较一下两个日期的大小值,然后再去根据结果进行传参。
当然可能会有人说我用的gpt不够智能,主要是可能我经济能力有限,没有去购买ChatGPT4.0,主打就是一个白嫖哈哈哈哈~
大佬们有更好的建议欢迎放在评论区~