Java Calendar为两个不同的日期返回相同的毫秒值

时间:2013-11-05 09:55:58

标签: java calendar

这是我的第一个问题,所以请温柔地对待我!我遇到了一些预先存在的java代码的问题。 这很简单,你以格式“2013-10-31”传递两个日期,然后计算两个值之间的ms差异,然后再进行一些计算。问题在于,即使传递了两个不同的日期,它们也会一次又一次地具有相同的毫秒值。例如,如果您传递“2013-10-31”和“2013-11-01”,它会将差异返回为0.毫秒值均为“1385856000000”。

代码是:

  public int getTotalStartEndTime( java.sql.Date startdate, java.sql.Date enddate, java.sql.Time starttime, java.sql.Time endtime )

{

if(startdate != null & enddate != null && starttime !=null && endtime!= null){

     Calendar calendar1 = Calendar.getInstance();
     Calendar calendar2 = Calendar.getInstance();
    int styr = Integer.parseInt(startdate.toString().substring(0,startdate.toString().indexOf("-")),10);
    int stmm = Integer.parseInt(startdate.toString().substring(startdate.toString().indexOf("-")+1,startdate.toString().lastIndexOf("-")),10);
    int stdd = Integer.parseInt(startdate.toString().substring(startdate.toString().lastIndexOf("-")+1),10);         
    int enyr = Integer.parseInt(enddate.toString().substring(0,enddate.toString().indexOf("-")),10);
    int enmm = Integer.parseInt(enddate.toString().substring(enddate.toString().indexOf("-")+1,enddate.toString().lastIndexOf("-")),10);
    int endd = Integer.parseInt(enddate.toString().substring(enddate.toString().lastIndexOf("-")+1),10);

    //calendar1.set(styr, stmm, stdd);
    calendar1.set(Calendar.YEAR, styr);
    calendar1.set(Calendar.MONTH, stmm);
    calendar1.set(Calendar.DAY_OF_MONTH, stdd);
    calendar1.set(Calendar.HOUR, 0);
    calendar1.set(Calendar.MINUTE, 0);
    calendar1.set(Calendar.SECOND, 0);
    calendar1.set(Calendar.MILLISECOND,0);
    //calendar2.set(enyr, enmm, endd);
    calendar2.set(Calendar.YEAR, enyr);
    calendar2.set(Calendar.MONTH, enmm);
    calendar2.set(Calendar.DAY_OF_MONTH, endd);
    calendar2.set(Calendar.HOUR, 0);
    calendar2.set(Calendar.MINUTE, 0);
    calendar2.set(Calendar.SECOND, 0);
    calendar2.set(Calendar.MILLISECOND,0);

    long milliseconds1 = calendar1.getTimeInMillis();
    long milliseconds2 = calendar2.getTimeInMillis();
    long diff = milliseconds2 - milliseconds1;

任何帮助将不胜感激,因为我无法弄清楚发生了什么!

3 个答案:

答案 0 :(得分:10)

日历月份为0-11,在您的代码中,您从字符串解析日期,而第10个月将转换为11月,而不是31天并且设置为12月1日。

答案 1 :(得分:1)

如前所述,MONTH为0-11。 您的代码没有抛出异常,因为lenient的默认值为true。 您应该将其设置为false(除非您明确要求此行为)以更轻松地检测此类情况:

calendar1.setLenient(false);
calendar2.setLenient(false);

答案 2 :(得分:-1)

它实际上并没有回答您的问题,但如果您需要的只是diff的值,则无需使用Calendar个实例,但您可以完全替换代码:

long diff = enddate.getTime() - startdate.getTime();

如果您确实需要Calendar个对象进行其他操作,仍然无需解析日期的字符串表示,您只需将Calendar设置为Date值即可一次操作:

Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(startdate.getTime());