我有一个验证方法,它将两个输入作为开始日期和结束日期,并检查结束日期是否有效,即在开始日期之后。
我使用Calendar方法getTimeInMillis()来获取两个日期的毫秒数并得到差值。如果差异为负,则其无效的结束日期,即结束日期早于开始日期。
结束日期的毫秒值应始终大于开始日期。但是在某些情况下,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)大,因此给出了错误的结果。

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

最佳答案

可能是由于Calendar.getInstance()为您提供了当前时间戳(已填写小时,分钟等所有字段),而您并未明确清除那些多余的字段(您只设置了年,月和日期) )。

另外,请注意dat Calendar.set(int year, int month, int day)使用从0开始的月份(例如Jan = 0,Feb = 1,等等),因此您的转换当前错误。

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

关于java - 日历方法getTimeInMillis()返回错误的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29029549/

10-13 02:48