DataBetween类的构造函数中做 defensive copy(pr#1426@Gitee)

This commit is contained in:
Looly
2025-12-26 00:06:41 +08:00
parent e216d15d9b
commit 76ec96e3f6
2 changed files with 38 additions and 24 deletions

View File

@@ -35,11 +35,11 @@ public class DateBetween implements Serializable {
/**
* 开始日期
*/
private final Date begin;
private final long begin;
/**
* 结束日期
*/
private final Date end;
private final long end;
/**
* 创建<br>
@@ -94,11 +94,11 @@ public class DateBetween implements Serializable {
if (isAbs && begin.after(end)) {
// 间隔只为正数的情况下,如果开始日期晚于结束日期,置换之
this.begin = end;
this.end = begin;
this.begin = end.getTime();
this.end = begin.getTime();
} else {
this.begin = begin;
this.end = end;
this.begin = begin.getTime();
this.end = end.getTime();
}
}
@@ -110,7 +110,7 @@ public class DateBetween implements Serializable {
* @return 时长差
*/
public long between(final DateUnit unit) {
final long diff = end.getTime() - begin.getTime();
final long diff = end - begin;
return diff / unit.getMillis();
}
@@ -183,8 +183,8 @@ public class DateBetween implements Serializable {
*
* @return 获取开始时间
*/
public Date getBegin() {
return begin;
public Date getBeginDate() {
return DateUtil.date(begin);
}
/**
@@ -192,8 +192,8 @@ public class DateBetween implements Serializable {
*
* @return 结束日期
*/
public Date getEnd() {
return end;
public Date getEndDate() {
return DateUtil.date(end);
}
/**

View File

@@ -16,12 +16,13 @@
package cn.hutool.v7.core.date;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class DateBetweenTest {
@Test
@@ -29,18 +30,18 @@ public class DateBetweenTest {
final Date start = DateUtil.parse("2017-02-01 12:23:46");
final Date end = DateUtil.parse("2018-02-01 12:23:46");
final long betweenYear = new DateBetween(start, end).betweenYear(false);
Assertions.assertEquals(1, betweenYear);
assertEquals(1, betweenYear);
final Date start1 = DateUtil.parse("2017-02-01 12:23:46");
final Date end1 = DateUtil.parse("2018-03-01 12:23:46");
final long betweenYear1 = new DateBetween(start1, end1).betweenYear(false);
Assertions.assertEquals(1, betweenYear1);
assertEquals(1, betweenYear1);
// 不足1年
final Date start2 = DateUtil.parse("2017-02-01 12:23:46");
final Date end2 = DateUtil.parse("2018-02-01 11:23:46");
final long betweenYear2 = new DateBetween(start2, end2).betweenYear(false);
Assertions.assertEquals(0, betweenYear2);
assertEquals(0, betweenYear2);
}
@Test
@@ -48,7 +49,7 @@ public class DateBetweenTest {
final Date start = DateUtil.parse("2000-02-29");
final Date end = DateUtil.parse("2018-02-28");
final long betweenYear = new DateBetween(start, end).betweenYear(false);
Assertions.assertEquals(18, betweenYear);
assertEquals(18, betweenYear);
}
@Test
@@ -59,7 +60,7 @@ public class DateBetweenTest {
final Date edate = DateUtil.parse(dateStr2);
final long result = DateUtil.betweenYear(sdate, edate, false);
Assertions.assertEquals(0, result);
assertEquals(0, result);
}
@Test
@@ -70,7 +71,7 @@ public class DateBetweenTest {
final Date edate = DateUtil.parse(dateStr2);
final long result = DateUtil.betweenYear(sdate, edate, false);
Assertions.assertEquals(1, result);
assertEquals(1, result);
}
@Test
@@ -82,7 +83,7 @@ public class DateBetweenTest {
final Date edate = DateUtil.parse(dateStr2);
final long result = DateUtil.betweenYear(sdate, edate, false);
Assertions.assertEquals(0, result);
assertEquals(0, result);
}
@Test
@@ -90,18 +91,18 @@ public class DateBetweenTest {
final Date start = DateUtil.parse("2017-02-01 12:23:46");
final Date end = DateUtil.parse("2018-02-01 12:23:46");
final long betweenMonth = new DateBetween(start, end).betweenMonth(false);
Assertions.assertEquals(12, betweenMonth);
assertEquals(12, betweenMonth);
final Date start1 = DateUtil.parse("2017-02-01 12:23:46");
final Date end1 = DateUtil.parse("2018-03-01 12:23:46");
final long betweenMonth1 = new DateBetween(start1, end1).betweenMonth(false);
Assertions.assertEquals(13, betweenMonth1);
assertEquals(13, betweenMonth1);
// 不足
final Date start2 = DateUtil.parse("2017-02-01 12:23:46");
final Date end2 = DateUtil.parse("2018-02-01 11:23:46");
final long betweenMonth2 = new DateBetween(start2, end2).betweenMonth(false);
Assertions.assertEquals(11, betweenMonth2);
assertEquals(11, betweenMonth2);
}
@Test
@@ -109,7 +110,7 @@ public class DateBetweenTest {
final Date date1 = DateUtil.parse("2017-03-01 20:33:23");
final Date date2 = DateUtil.parse("2017-03-01 23:33:23");
final String formatBetween = DateUtil.formatBetween(date1, date2, BetweenFormatter.Level.SECOND);
Assertions.assertEquals("3小时", formatBetween);
assertEquals("3小时", formatBetween);
}
@Test
@@ -122,6 +123,19 @@ public class DateBetweenTest {
TimeUtil.parse("2020-11-21", "yyy-MM-dd"),
TimeUtil.parse("2020-11-23", "yyy-MM-dd"),
ChronoUnit.WEEKS);
Assertions.assertEquals(betweenWeek, betweenWeek2);
assertEquals(betweenWeek, betweenWeek2);
}
@Test
public void issueIDFVKGTest() {
Date b = new Date(1609459200000L); // 2021-01-01 00:00:00
Date e = new Date(1609545600000L); // 2021-01-02 00:00:00
DateBetween db = new DateBetween(b, e);
// 修改原始 date
b.setTime(0L); // 1970-01-01
// 期望 DateBetween 不受影响,间隔仍为 1 天
assertEquals(1, db.between(DateUnit.DAY));
}
}