gpt4 book ai didi

java - 代码审查 : java Dates diff (in day resolution)

转载 作者:行者123 更新时间:2023-12-03 23:14:11 25 4
gpt4 key购买 nike

请您对以下代码提出意见。

我需要计算 2 个 Date 对象之间的天数差异。确保两个 Date 对象都在同一时区内。

public class DateUtils {
public final static long DAY_TIME_IN_MILLIS = 24 * 60 * 60 * 1000;

/**
* Compare between 2 dates in day resolution.
*
* @return positive integer if date1 > date2, negative if date1 < date2. 0 if they are equal.
*/
public static int datesDiffInDays(final Date date1, final Date date2){
long date1DaysMS = date1.getTime() - (date1.getTime() % DAY_TIME_IN_MILLIS);
long date2DaysMS = date2.getTime() - (date2.getTime() % DAY_TIME_IN_MILLIS);

long timeInMillisDiff = (date1DaysMS - date2DaysMS);
int ret = (int) (timeInMillisDiff / DAY_TIME_IN_MILLIS);
return ret;
}

你能指出一个我可能遗漏的问题吗?

编辑:@mmyers 询问是否通过我的单元测试。嗯,是。但我对约会没有真正的经验,我知道这是一个很大的话题。发布在我正在使用的单元测试下方。

public class TestMLDateUtils {

@Test
public final void testDatesDiffInDays() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

// 00:00:00.000 1.1.1970
Calendar cal1970 = Calendar.getInstance();
cal1970.setTimeInMillis(0);

Calendar tested = Calendar.getInstance();
tested.setTimeInMillis(0);

// Add 1 millisecond, date = 00:00:00.001 1.1.1970
tested.add(Calendar.MILLISECOND, 1);

assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == 0);

// Add 1 second, date = 00:00:01.001 1.1.1970
tested.add(Calendar.SECOND, 1);
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == 0);

// Add 1 minute, date = 00:01:01.001 1.1.1970
tested.add(Calendar.MINUTE, 1);
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == 0);

// Add 1 hour, date = 01:01:01.001 1.1.1970
tested.add(Calendar.HOUR_OF_DAY, 1);
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == 0);

// date = 23:59:59.999 1.1.1970
tested.setTimeInMillis(0);
tested.add(Calendar.MILLISECOND, 999);
tested.add(Calendar.SECOND, 59);
tested.add(Calendar.MINUTE, 59);
tested.add(Calendar.HOUR_OF_DAY, 23);
//System.out.println("D: " + tested.getTime());
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == 0);

// date = 00:00:00.000 2.1.1970
tested.setTimeInMillis(0);
tested.add(Calendar.DAY_OF_MONTH, 1);
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == -1);
assertTrue(DateUtils.datesDiffInDays(tested.getTime(), cal1970.getTime()) == 1);

// date = 00:00:00.001 2.1.1970
tested.add(Calendar.MILLISECOND, 1);
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == -1);
assertTrue(DateUtils.datesDiffInDays(tested.getTime(), cal1970.getTime()) == 1);

// date = 00:00:01.001 2.1.1970
tested.add(Calendar.SECOND, 1);
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == -1);
assertTrue(DateUtils.datesDiffInDays(tested.getTime(), cal1970.getTime()) == 1);

// date = 00:01:01.001 2.1.1970
tested.add(Calendar.MINUTE, 1);
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == -1);
assertTrue(DateUtils.datesDiffInDays(tested.getTime(), cal1970.getTime()) == 1);

// date = 01:01:01.001 2.1.1970
tested.add(Calendar.HOUR_OF_DAY, 1);
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == -1);
assertTrue(DateUtils.datesDiffInDays(tested.getTime(), cal1970.getTime()) == 1);

// date = 13:01:01.001 2.1.1970
tested.add(Calendar.HOUR_OF_DAY, 12);
assertTrue(DateUtils.datesDiffInDays(cal1970.getTime(), tested.getTime()) == -1);
assertTrue(DateUtils.datesDiffInDays(tested.getTime(), cal1970.getTime()) == 1);
}
}

最佳答案

  • 直接问题:由于夏令时的变化,天数可能少于或多于 24 小时。

  • 次要问题:通常当人们以天为单位思考时,他们真正指的是“人类的日子”,而不是“24 小时的周期”。换句话说,很多人会说晚上 7 点到第二天早上 7 点是一天的差异,而同一天的早上 7 点到晚上 7 点是零天的差异。两者都是12小时。到那时,您真的需要知道正在考虑的日历。

当然,这对您的情况可能无关紧要,但我们真的不知道那是什么。

  • 第三个问题:您使用的是内置日历 API 而不是 Joda Time .这几乎从来都不是一个好主意——它很糟糕,而且充满陷阱和问题。是的,这里的常客会告诉您,当涉及到 Java 日期和时间时,这总是是我回答的一部分 - 并且有充分的理由。这真的很重要。

编辑:您的测试将默认时区设置为 UTC。这不是一个好主意(尤其是没有在 finally 语句中重置它)。时区很棘手,但您真的应该考虑您拥有的值、它们的含义以及涉及的时区。

关于java - 代码审查 : java Dates diff (in day resolution),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/883871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com