这是我的第一个问题,所以请温柔地对待我!我遇到了一些预先存在的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;
任何帮助将不胜感激,因为我无法弄清楚发生了什么!
答案 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());