2015-03-13 51 views
0

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

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

回答

1

它可以通过一个事实,即Calendar.getInstance()给你当前时间戳(含各个领域喜欢小时,分钟等填写)引起的,而你没有明确地明确这些额外的字段(您只设置年份,月份和日期)。

而且,记住DAT Calendar.set(int year, int month, int day)使用基于0个月(如一月= 0,二月= 1,等等),所以您的转换是当前错误的。

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

0

使用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(); 
0

一个问题是,如果我们将month设置为-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