当前位置: 首页 > 知识库问答 >
问题:

日历方法getTimeInMillis()返回错误的值

林念
2023-03-14

我有一个验证方法,将两个输入作为开始日期和结束日期,并检查结束日期是否有效,即在开始日期之后。我使用Calendar方法获取两个日期的毫秒数并得到差值。如果差值为负值,则其无效的结束日期,即结束日期早于开始日期。结束日期的毫秒值应始终大于开始日期。但在某些情况下,在开始日期的情况下,getTimeInMillis()会提供更大的值。

这是我的代码:

public class ValidationProcessor {
    private void testTimeDiff(String startDate, String endDate) throws Exception {
        Calendar cal1 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        // Set the dates for calendars
        cal1.set(Integer.parseInt(startDate.split("-")[0]), Integer.parseInt(startDate.split("-")[1]),
            Integer.parseInt(startDate.split("-")[2]));
        cal2.set(Integer.parseInt(endDate.split("-")[0]), Integer.parseInt(endDate.split("-")[1]),
            Integer.parseInt(endDate.split("-")[2]));
        long milis1 = cal1.getTimeInMillis();
        long milis2 = cal2.getTimeInMillis();
        System.out.println("milis1::: " + milis1);
        System.out.println("milis2::: " + milis2);
        long diff = milis2 - milis1;
        System.out.println("diff::: " + diff);
        if (diff <= 0) {
            throw new Exception("Invalid End Date. End Date Must Be After Start Date");
        }
    }

    public static void main(String args[]) {
        ValidationProcessor test = new ValidationProcessor();
        try {
            test.testTimeDiff("2015-01-31", "2015-02-01");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

输出为:

milis1::: 1425367717308
milis2::: 1425194917308
diff::: -172800000

java.lang.Exception: Invalid End Date. End Date Must Be After Start Date

这里2015-01-31是开始日期,2015-02-01是结束日期。由于开始日期(2015-01-31)以毫秒为单位的值大于结束日期(2015-02-01)因此它会给出错误的结果。

那么这是Calendar类的方法getTimeInMillis()的问题还是我做错了什么?

共有3个答案

林彬
2023-03-14

一个问题是,如果我们将月份设置为-1,那么它会给出正确的结果。喜欢

cal1.set(Integer.parseInt(startDate.split("-")[0]), Integer.parseInt(startDate.split("-")[1]) -1,
            Integer.parseInt(startDate.split("-")[2]));
cal2.set(Integer.parseInt(endDate.split("-")[0]), Integer.parseInt(endDate.split("-")[1]-1),
            Integer.parseInt(endDate.split("-")[2]));

它给出,差异为86400000

姚子石
2023-03-14

使用cal1。getTime()。getAfter(cal2.getTime())

更新1

要填满您的日历,您应该像下面这样做

//cal1.set(Integer.parseInt(startDate.split("-")[0]), Integer.parseInt(startDate.split("-")[1]), Integer.parseInt(startDate.split("-")[2]));
//cal2.set(Integer.parseInt(endDate.split("-")[0]), Integer.parseInt(endDate.split("-")[1]), Integer.parseInt(endDate.split("-")[2]));

DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
cal1.setTime(df.parse(startDate));
cal2.setTime(df.parse(endDate));

那么您的原始代码也可以工作。

更新2

而您可以避免为此特定用途使用日历并直接使用日期对象。

Date date1 = df.parse(startDate);
Date date2 = df.parse(endDate);

long milis1 = date1.getTime();
long milis2 = date2.getTime();
施飞驰
2023-03-14

这可能是因为Calendar.getInstance()为您提供当前时间戳(填写了小时、分钟等所有字段),而您没有明确清除这些额外的字段(您只设置了年、月和日期)。

此外,请记住日期。set(int year、int month、int day)使用基于0的月份(例如,一月=0、二月=1等),因此您的转换当前是错误的。

更新:我认为这是两者的结合;您的测试日期2015-01-31被解析为2015年2月31日,这当然无效,导致出现意外的值。

 类似资料:
  • 问题内容: 执行以上代码段后,month的值为10而不是11。 问题答案: 月份从0而不是1索引,因此10是11月,而11是12月。

  • 我想在将一周的第一天设置为周日后,将2018年10月9日这一周作为一年中的42周。我仍然从下面的代码片段中得到41的输出 我错过了什么吗? 背景:我们一周的开始可能是可变的。我们的配置能够让用户决定一周的第一天。

  • 我想创建一个日历对象,并将其设置为某一年和该年中的一周。 当我将calendar对象传递给setWeekChecked方法时,这是它的toString: java.util.gregoriancalendar[time=?,arefieldsset=false,lenient=true,zone=America/New_York,firstDayofWeek=1,minimalDaysinfirs

  • 问题内容: 所以我在这里呆了几个小时,它返回正确的Year和Day,但是由于某种奇怪的原因,它返回了错误的月份。我确定它是一个简单的修复程序,但我似乎无法弄清楚。 问题答案: 要获得本月的1-12数字: 最好指定所需/预期的时区。 类似地,呼叫和。 细节 它返回错误的月份 就像其他人所说的,在 1月至12月的 几个月中,他们疯狂地编号为0-11, 而不是1-12。在旧的日期时间类中,许多糟糕的设计

  • 所以我已经研究了几个小时了,它返回了正确的年和日,但是由于一些奇怪的原因,它返回了错误的月份。我确信这是一个简单的修复,但我似乎无法解决这个问题。

  • 当我用mockito模拟它并在以下情况下使用该方法时: 我得到了错误: 无法解析方法“then return(java.lang.String)” 但是上面返回的是可选的'<'object'>'和非可选的'<'string'>的实例。 为什么我不能直接返回一个可选的'<'string'>'实例呢?如果可以的话,我该怎么做呢?