java - 用java计算月份和时差?

标签 java

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

    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();
            }
        }

最佳答案

请使用当前 Java 标准的 JSR-310(称为 ThreeTen)。它提供了诸如 DurationChronoUnit 之类的类,其中包含所有必要的工具。

例如ChronoUnit.MONTHS. Between() 将计算 2 个日期之间的跨度(以月为单位)

关于java - 用java计算月份和时差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43650443/

相关文章:

java - Jersey 类路径扫描示例 jersey.config.server.provider.classpath

java - 在 Java 中使用 Microsoft Project Oxford API

java - java编译器如何检查接口(interface)中的所有方法是否都已实现?

使用 IKVM 的 C# 库在 IKVM.OpenJDK.ClassLibrary 和 IKVM.OpenJDK.Core 之间存在命名空间歧义

java - AspectJ 编译器 DeclareMixin 错误

java - 点燃 Spring + 点燃 SQL ClassCastException

java - 在SQL IN子句中多次传递900个参数并使用Java导出到xlsx文件

java - 没有映射操作 - Struts 2

java - Java 中的抽象类

java - 自动从实体类更新/复制/继承DTO javadoc