2017-04-27 18 views
1

我有这个代码来计算月份和时间差,但这段代码给出了错误的输出 其计算3个月甚至实际月份差异是1当我测试此代码和时间相同的情况下,请帮助这个代码中的问题在哪里。 ...计算java中的月份和时间差异?

public static void updateLinkDownTimeDate(ObjectId TimeDateId, TimeDatePojo TimeDatePojo) { 
      try { 
       List<DBObject> array = new ArrayList<>(); 
       BasicDBObject match = new BasicDBObject(); 
       match.put("_id", TimeDateId); 
       DBCollection collection = new MongoSetup().getDBCollection("TimeDate"); 
       DBObject obj = TimeDatePojo.bsomFromPojo(); 
       String newId = (String) obj.get("linkId"); 
       SimpleDateFormat dates = new SimpleDateFormat("dd-MM-yyyy"); 
       String startDate = dates.format(obj.get("startDate")); 
       String endDate = dates.format(obj.get("endDate")); 
       Date SD = dates.parse(startDate); 
       Date ED = dates.parse(endDate); 
       Calendar cal = Calendar.getInstance(); 
       cal.setTime(SD); 
       int month = cal.get(Calendar.MONTH); 
       int year = cal.get(Calendar.YEAR); 

       String startTime = (String) obj.get("startTime"); //present start time 
       SimpleDateFormat forms = new SimpleDateFormat("dd-MM-yyyy"); 
       SimpleDateFormat form = new SimpleDateFormat("HH:mm:ss"); 
       Calendar currentStartDateCalendar = Calendar.getInstance(); 
       currentStartDateCalendar.setTime(SD); 
       int currentSDate = currentStartDateCalendar.get(Calendar.DATE); 
       int currentStartMonth = currentStartDateCalendar.get(Calendar.MONTH); 
       int currentStartYear = currentStartDateCalendar.get(Calendar.YEAR); 
       Date STs = form.parse(startTime); 
       Calendar presentStartTime = Calendar.getInstance(); 
       presentStartTime.setTime(STs); 
       int currentHour = presentStartTime.get(Calendar.HOUR); 
       int currentMin = presentStartTime.get(Calendar.MINUTE); 
       int currentSec = presentStartTime.get(Calendar.SECOND); 
       currentStartDateCalendar.set(currentStartYear, currentStartMonth, currentSDate, currentHour, currentMin, currentSec); 
       Date PSDate = currentStartDateCalendar.getTime(); 

       String endTime = (String) obj.get("endTime"); //present end time 
       Date ETs = form.parse(endTime); 
       Calendar currentEndDateCalender = Calendar.getInstance(); 
       currentEndDateCalender.setTime(ED); 
       int currentEDate = currentEndDateCalender.get(Calendar.DATE); 
       int currentEndMonth = currentEndDateCalender.get(Calendar.MONTH); 
       int currentEYear = currentEndDateCalender.get(Calendar.YEAR); 
       Calendar presentEndTime = Calendar.getInstance(); 
       presentEndTime.setTime(ETs); 
       int currentEndHour = presentEndTime.get(Calendar.HOUR); 
       int currentEndMin = presentEndTime.get(Calendar.MINUTE); 
       int currentEndSec = presentEndTime.get(Calendar.SECOND); 
       currentEndDateCalender.set(currentEYear, currentEndMonth, currentEDate, currentEndHour, currentEndMin, currentEndSec); 
       Date PEDate = currentEndDateCalender.getTime(); 
       BasicDBObject getSavedDate = new BasicDBObject(); 
       getSavedDate.append("_id", linkDownTimeDateId); 
       getSavedDate.append("linkId", newId); 
       DBObject seeSaved = collection.findOne(getSavedDate); 
       Date savedSDate = (Date) seeSaved.get("startDate"); 
       Date savedEDate = (Date) seeSaved.get("endDate"); 
       String savedStartTime = (String) seeSaved.get("startTime"); 
       String savedEndTime = (String) seeSaved.get("endTime"); 
       Date SSD = null; 
       Date SED = null; 
       if (savedSDate.compareTo(SD) == 0 && savedEDate.compareTo(ED) == 0) { 
        Calendar saveStartTimeCalendar = Calendar.getInstance(); 
        saveStartTimeCalendar.setTime(savedSDate); 
        int savedYear = saveStartTimeCalendar.get(Calendar.YEAR); 
        int savedMonth = saveStartTimeCalendar.get(Calendar.MONTH); 
        int savedDate = saveStartTimeCalendar.get(Calendar.DATE); 
        Date SSTs = form.parse(savedStartTime); 
        Calendar savedStartTimeCal = Calendar.getInstance(); 
        savedStartTimeCal.setTime(SSTs); 
        int hour = savedStartTimeCal.get(Calendar.HOUR); 
        int mins = savedStartTimeCal.get(Calendar.MINUTE); 
        int secs = savedStartTimeCal.get(Calendar.SECOND); 
        saveStartTimeCalendar.set(savedYear, savedMonth, savedDate, hour, mins, secs); 
        SSD = saveStartTimeCalendar.getTime(); 
        Calendar saveEndTimeCalendar = Calendar.getInstance(); 
        saveStartTimeCalendar.setTime(savedEDate); 
        int savedEndYear = saveEndTimeCalendar.get(Calendar.YEAR); 
        int savedEndMonth = saveEndTimeCalendar.get(Calendar.MONTH); 
        int savedEndDates = saveEndTimeCalendar.get(Calendar.DATE); 
        Date ESTs = form.parse(savedEndTime); 
        Calendar savedEndTimeCal = Calendar.getInstance(); 
        savedEndTimeCal.setTime(ESTs); 
        int endhour = savedStartTimeCal.get(Calendar.HOUR); 
        int endmins = savedStartTimeCal.get(Calendar.MINUTE); 
        int endsecs = savedStartTimeCal.get(Calendar.SECOND); 
        saveEndTimeCalendar.set(savedEndYear, savedEndMonth, savedEndDates, endhour, endmins, endsecs); 
        SED = saveEndTimeCalendar.getTime(); 
       } else if (savedSDate.compareTo(SD) == -1 || savedEDate.compareTo(ED) == -1) { 
        Calendar saveStartTimeCalendar = Calendar.getInstance(); 
        saveStartTimeCalendar.setTime(SD); 
        int savedYear = saveStartTimeCalendar.get(Calendar.YEAR); 
        int savedMonth = saveStartTimeCalendar.get(Calendar.MONTH); 
        int savedDate = saveStartTimeCalendar.get(Calendar.DATE); 
        Date SSTs = form.parse(savedStartTime); 
        Calendar savedStartTimeCal = Calendar.getInstance(); 
        savedStartTimeCal.setTime(SSTs); 
        int hour = savedStartTimeCal.get(Calendar.HOUR); 
        int mins = savedStartTimeCal.get(Calendar.MINUTE); 
        int secs = savedStartTimeCal.get(Calendar.SECOND); 
        saveStartTimeCalendar.set(savedYear, savedMonth, savedDate, hour, mins, secs); 
        SSD = saveStartTimeCalendar.getTime(); 
        Calendar saveEndTimeCalendar = Calendar.getInstance(); 
        saveStartTimeCalendar.setTime(ED); 
        int savedEndYear = saveEndTimeCalendar.get(Calendar.YEAR); 
        int savedEndMonth = saveEndTimeCalendar.get(Calendar.MONTH); 
        int savedEndDates = saveEndTimeCalendar.get(Calendar.DATE); 
        Date ESTs = form.parse(savedEndTime); 
        Calendar savedEndTimeCal = Calendar.getInstance(); 
        savedEndTimeCal.setTime(ESTs); 
        int endhour = savedStartTimeCal.get(Calendar.HOUR); 
        int endmins = savedStartTimeCal.get(Calendar.MINUTE); 
        int endsecs = savedStartTimeCal.get(Calendar.SECOND); 
        saveEndTimeCalendar.set(savedEndYear, savedEndMonth, savedEndDates, endhour, endmins, endsecs); 
        SED = saveEndTimeCalendar.getTime(); 
       } 
       List<DBObject> lists = (List<DBObject>) seeSaved.get("linkDownTime"); 
       int down = 0; 
       for (DBObject dating : lists) { 
        down = (int) dating.get("downTime"); //saved down time 
       } 
       String startHour = "00:00:00"; 
       String endHour = "24:00:00"; 
       long minutesInOneDay = 1440; 
       int numberOfDays = 0; 
       long dateDifference = 0l; 
       int totalCalculatedMins = 0; 
       try { 
        dateDifference = ED.getTime() - SD.getTime(); 
        long days = dateDifference/(24 * 60 * 60 * 1000); 
        numberOfDays = (int) days; 
        if (numberOfDays == 0) { 
         int min = (int) minutesInOneDay; 
         SimpleDateFormat format2 = new SimpleDateFormat("HH:mm:ss"); 
         Date parsedStartTime = format2.parse(startTime); 
         Date parsedEndTime = format2.parse(endTime); 
         Date parsedOriginalStartHour = format2.parse(startHour); 
         Date parsedOriginalEndHour = format2.parse(endHour); 
         long excludeStartTime = parsedOriginalEndHour.getTime() - parsedStartTime.getTime(); 
         long excludedStartMins = minutesInOneDay - (excludeStartTime/(60 * 1000)); 
         int excludedMins = (int) excludedStartMins; 
         long excludeEndTime = parsedEndTime.getTime() - parsedOriginalStartHour.getTime(); 
         long excludeEndMins = 1440 - (excludeEndTime/(60 * 1000)); 
         int excludeMins2 = (int) excludeEndMins; 
         long calculation = min - excludedMins - excludeMins2; 
         totalCalculatedMins = (int) calculation; 
        } else { 
         long minuetes = (minutesInOneDay * numberOfDays); 
         int min = (int) minuetes; 
         SimpleDateFormat format2 = new SimpleDateFormat("HH:mm:ss"); 
         Date parsedStartTime = format2.parse(startTime); 
         Date parsedEndTime = format2.parse(endTime); 
         Date parsedOriginalStartHour = format2.parse(startHour); 
         Date parsedOriginalEndHour = format2.parse(endHour); 
         long excludeStartTime = parsedOriginalEndHour.getTime() - parsedStartTime.getTime(); 
         long excludedStartMins = excludeStartTime/(60 * 1000); 
         int excludedMins = (int) excludedStartMins; 
         long excludeEndTime = parsedEndTime.getTime() - parsedOriginalStartHour.getTime(); 
         long excludeEndMins = 1440 + (-(excludeEndTime/(60 * 1000))); 
         int excludeMins2 = (int) excludeEndMins; 
         long calculation = min + excludedMins - excludeMins2; 
         totalCalculatedMins = (int) calculation; 
        } 
       } catch (Exception e) { 
        System.out.println("Exception being :-" + e); 
       } 
       DBObject sub = new BasicDBObject(); 
       sub.put("linkId", newId); 
       sub.put("year", year); 
       sub.put("month", month); 
       sub.put("downTime", totalCalculatedMins); 
       array.add(sub); 
       obj.put("linkDownTime", array); 
       BasicDBObject update = new BasicDBObject(); 
       update.put("$set", obj); 
       collection.update(match, update, true, false); 
       BasicDBObject newQuery = new BasicDBObject("linkId", obj.get("linkId")) 
         .append("startDate", obj.get("startDate")) 
         .append("endDate", obj.get("endDate")); 
       DBObject findNewQuery = collection.findOne(newQuery); 
       DBCollection collection2 = new MongoSetup().getDBCollection("linkTotalDownTime"); 
       List<DBObject> list = (List<DBObject>) findNewQuery.get("linkDownTime"); 
       for (DBObject data : list) { 
        String linkId = (String) data.get("linkId"); 
        int years = (int) data.get("year"); 
        int months = (int) data.get("month"); 
        int downTime = (int) data.get("downTime"); // current downTime 

        BasicDBObject look = new BasicDBObject(); 
        look.append("linkID", linkId).append("Year", year).append("month", month); 
        DBObject findData = collection2.findOne(look); 
        int dataget = (int) findData.get("totaldownTime"); //totaldowntime 
        int finalValue = 0; 
        int finalTotalValue = 0; 
        if (collection2.count() == 1) { 
         if (PSDate.compareTo(SSD) == 1) { 
          if (downTime > down) { 
           finalValue = down - downTime; 
           finalTotalValue = (int) (dataget - finalValue); 
          } else if (down > downTime) { 
           finalValue = down - downTime; 
           finalTotalValue = (int) (dataget - finalValue); 
          } 
         } else if (PSDate.compareTo(SSD) == -1) { 
          if (downTime > down) { 
           finalValue = downTime - down; 
           finalTotalValue = (int) (dataget + finalValue); 
          } else if (down > downTime) { 
           finalValue = down - downTime; 
           finalTotalValue = (int) (dataget + finalValue); 
          } 
         } else if (PEDate.compareTo(SED) == 1) { 
          if (downTime > down) { 
           finalValue = downTime - down; 
           finalTotalValue = (int) (dataget + finalValue); 
          } else if (down > downTime) { 
           finalValue = down - downTime; 
           finalTotalValue = (int) (dataget + finalValue); 
          } 
         } else if (PEDate.compareTo(SED) == -1) { 
          if (downTime > down) { 
           finalValue = downTime - down; 
           finalTotalValue = (int) (dataget - finalValue); 
          } else if (down > downTime) { 
           finalValue = down - downTime; 
           finalTotalValue = (int) (dataget - finalValue); 
          } 
         } 
        } else if (collection2.count() > 1) { 
         if (PSDate.compareTo(SSD) == 1) { 
          if (downTime > down) { 
           finalValue = downTime - down; 
           finalTotalValue = (int) (dataget - finalValue); 
          } else if (down > downTime) { 
           finalValue = down - downTime; 
           finalTotalValue = (int) (dataget - finalValue); 
          } 
         } else if (PSDate.compareTo(SSD) == -1) { 
          if (downTime > down) { 
           finalValue = downTime - down; 
           finalTotalValue = (int) (dataget + finalValue); 
          } else if (down > downTime) { 
           finalValue = down - downTime; 
           finalTotalValue = (int) (dataget + finalValue); 
          } 
         } else if (PEDate.compareTo(SED) == 1) { 
          if (downTime > down) { 
           finalValue = downTime - down; 
           finalTotalValue = (int) (dataget + finalValue); 
          } else if (down > downTime) { 
           finalValue = down - downTime; 
           finalTotalValue = (int) (dataget + finalValue); 
          } 
         } else if (PEDate.compareTo(SED) == -1) { 
          if (downTime > down) { 
           finalValue = downTime - down; 
           finalTotalValue = (int) (dataget - finalValue); 
          } else if (down > downTime) { 
           finalValue = down - downTime; 
           finalTotalValue = (int) (dataget - finalValue); 
          } 
         } 
        } 
        BasicDBObject update_two = new BasicDBObject(); 
        update_two.put("linkID", linkId); 
        update_two.put("Year", years); 
        update_two.put("month", months); 
        update_two.put("totaldownTime", finalTotalValue); 
        collection2.update(findData, update_two, true, false); 
       } 
       System.out.println("Updated Successfully ..."); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
+0

您应遵循@ LukeJanyga的建议并使用java.time框架。停止使用原始java.util.Date对象并开始使用LocalDateTime,LocalDate,LocalTime等。 – russellhoff

+0

你能告诉我为什么它没有给出正确的月份差异和时间差异吗? –

+0

我没有空闲时间来看看你的代码。最好的方法是切换到java时间:因为您可以更快地工作,从而减少代码行数量。 – russellhoff

回答

1

请使用JSR-310(被称为ThreeTen),这是目前Java的标准。它提供了类似DurationChronoUnit的类,其中包含所有必要的工具。

E.g. ChronoUnit.MONTHS.between()会计算两个月份之间的跨度

-1
String calculateTime(String strDate) throws ParseException { 

    String result = ""; 
    SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMHHmm"); 
    Date currDate = new Date(); 
    String date = dateFormat.format(currDate); 

    currDate = dateFormat.parse(date); 
    Date postDate = dateFormat.parse(strDate); 

    //calculate day diff 
    long timeDiff = currDate.getTime() - postDate.getTime(); 
    long daysDiff = TimeUnit.MILLISECONDS.toDays(timeDiff); 
    Calendar calendar = GregorianCalendar.getInstance(); 
    calendar.setTime(postDate); 

    if (daysDiff == 1) { 


     result = "yesterday"; 
     result = result + " at " + getHour(calendar.get(Calendar.HOUR)) + ":" 
       + setPrefix(calendar.get(Calendar.MINUTE))+ " " + getAM_PM(calendar.get(Calendar.AM_PM)); 

    } else if (daysDiff > 1) { 

     result = calendar.get(Calendar.DATE) + " " + getMonthForInt(calendar.get(Calendar.MONTH)); 
     result = result + " at " + getHour(calendar.get(Calendar.HOUR)) + ":" 
       + setPrefix(calendar.get(Calendar.MINUTE)) + " " + getAM_PM(calendar.get(Calendar.AM_PM)); 

    } else { 

     long minDiff = TimeUnit.MILLISECONDS.toMinutes(timeDiff); 


     if (minDiff == 0) { 

      result = "just now"; 
     } else if (minDiff < 60) { 

      if (minDiff == 1) { 

       result = minDiff + " min ago"; 
      } else if(minDiff > 1) { 
       result = minDiff + " mins ago"; 
      } 

     } else { 

      long hourDiff = TimeUnit.MILLISECONDS.toHours(timeDiff); 

      if (hourDiff == 1) { 

       result = hourDiff + " hr ago"; 
      } else if(hourDiff > 1){ 

       result = hourDiff + " hrs ago"; 

      } 

     } 

    } 

    return result; 
}