Java tutorial
/** * Axelor Business Solutions * * Copyright (C) 2015 Axelor (<http://axelor.com>). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.axelor.apps.tool.date; import org.joda.time.Days; import org.joda.time.LocalDate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DateTool { private static final Logger LOG = LoggerFactory.getLogger(DateTool.class); public static int daysBetween(LocalDate date1, LocalDate date2, boolean days360) { int days = 0; if (days360) { if (date1.isBefore(date2)) { days = days360Between(date1, date2); } else { days = -days360Between(date2, date1); } } else { days = daysBetween(date1, date2); } LOG.debug("Nombre de jour entre {} - {} (mois de 30 jours ? {}) : {}", new Object[] { date1, date2, days360, days }); return days; } private static int daysBetween(LocalDate date1, LocalDate date2) { if (date2.isBefore(date1)) { return Days.daysBetween(date1, date2).getDays() - 1; } else { return Days.daysBetween(date1, date2).getDays() + 1; } } private static int days360Between(LocalDate startDate, LocalDate endDate) { int nbDayOfFirstMonth = 0; int nbDayOfOthersMonths = 0; int nbDayOfLastMonth = 0; LocalDate start = startDate; if (endDate.getMonthOfYear() != startDate.getMonthOfYear() || endDate.getYear() != startDate.getYear()) { // First month :: if the startDate is not the last day of the month if (!startDate.isEqual(startDate.dayOfMonth().withMaximumValue())) { nbDayOfFirstMonth = 30 - startDate.getDayOfMonth(); } // The startDate is included nbDayOfFirstMonth = nbDayOfFirstMonth + 1; // Months between the first one and the last one LocalDate date1 = startDate.plusMonths(1).dayOfMonth().withMinimumValue(); while (endDate.getMonthOfYear() != date1.getMonthOfYear() || endDate.getYear() != date1.getYear()) { nbDayOfOthersMonths = nbDayOfOthersMonths + 30; date1 = date1.plusMonths(1); } // Last Month start = endDate.dayOfMonth().withMinimumValue(); } if (endDate.isEqual(endDate.dayOfMonth().withMaximumValue())) { nbDayOfLastMonth = 30 - start.getDayOfMonth(); } else { nbDayOfLastMonth = endDate.getDayOfMonth() - start.getDayOfMonth(); } // The endDate is included nbDayOfLastMonth = nbDayOfLastMonth + 1; return nbDayOfFirstMonth + nbDayOfOthersMonths + nbDayOfLastMonth; } public static int days360MonthsBetween(LocalDate startDate, LocalDate endDate) { if (startDate.isBefore(endDate)) { return days360Between(startDate, endDate) / 30; } else { return -days360Between(endDate, startDate) / 30; } } public static boolean isProrata(LocalDate dateFrame1, LocalDate dateFrame2, LocalDate date1, LocalDate date2) { if (date2 == null && (date1.isBefore(dateFrame2) || date1.isEqual(dateFrame2))) { return true; } else if (date2 == null) { return false; } if (((date1.isAfter(dateFrame1) || date1.isEqual(dateFrame1)) && (date1.isBefore(dateFrame2) || date1.isEqual(dateFrame2))) || ((date2.isAfter(dateFrame1) || date2.isEqual(dateFrame1)) && (date2.isBefore(dateFrame2) || date2.isEqual(dateFrame2))) || (date1.isBefore(dateFrame1) && date2.isAfter(dateFrame2))) { return true; } return false; } public static boolean isBetween(LocalDate dateFrame1, LocalDate dateFrame2, LocalDate date) { if (dateFrame2 == null && (date.isAfter(dateFrame1) || date.isEqual(dateFrame1))) { return true; } else if (dateFrame2 != null && (date.isAfter(dateFrame1) || date.isEqual(dateFrame1)) && (date.isBefore(dateFrame2) || date.isEqual(dateFrame2))) { return true; } else { return false; } } /** * Calculer la date de la prochaine occurence d'un vnement suivant le calcul suivant : * Supprimer autant de fois que possible la frquence en mois la date vise * tout en tant suprieure la date de dbut * * @param startDate * La date de dbut * * @param goalDate * La date vise * * @param frequencyInMonth * Nombre de mois reprsentant la frquence de l'vnement */ public static LocalDate nextOccurency(LocalDate startDate, LocalDate goalDate, int frequencyInMonth) { if (frequencyInMonth == 0) { LOG.debug("La frquence ne doit pas etre gale 0."); return null; } else { if (startDate == null && goalDate == null) { return null; } else { if (startDate.isAfter(goalDate)) { return goalDate; } return minusMonths(goalDate, days360MonthsBetween(startDate.plusDays(1), goalDate.minusDays(1)) / frequencyInMonth * frequencyInMonth); } } } /** * Calculer la date de la prochaine occurence d'un vnement suivant le calcul suivant : * Supprimer autant de fois que possible la frquence en mois la date vise * tout en tant suprieure ou gale la date de dbut * * @param startDate * La date de dbut * * @param goalDate * La date vise * * @param frequencyInMonth * Nombre de mois reprsentant la frquence de l'vnement */ public LocalDate nextOccurencyStartDateIncluded(LocalDate startDate, LocalDate goalDate, int frequencyInMonth) { if (frequencyInMonth == 0) { LOG.debug("La frquence ne doit pas etre gale 0."); return null; } else { if (startDate == null && goalDate == null) { return null; } else { if (startDate.isAfter(goalDate)) { return goalDate; } return minusMonths(goalDate, days360MonthsBetween(startDate, goalDate.minusDays(1)) / frequencyInMonth * frequencyInMonth); } } } /** * Calculer la date de la dernire occurence d'un vnement suivant le calcul suivant : * Ajouter autant de fois que possible la frquence en mois la date de dbut * tout en tant infrieure ou gale la date de fin * @param startDate * La date de dbut * * @param endDate * La date de fin * * @param frequencyInMonth * Nombre de mois reprsentant la frquence de l'vnement */ public static LocalDate lastOccurency(LocalDate startDate, LocalDate endDate, int frequencyInMonth) { if (frequencyInMonth == 0) { LOG.debug("La frquence ne doit pas etre gale 0."); return null; } else { if ((startDate == null && endDate == null) || startDate.isAfter(endDate)) { return null; } else { return plusMonths(startDate, days360MonthsBetween(startDate, endDate) / frequencyInMonth * frequencyInMonth); } } } public static LocalDate minusMonths(LocalDate date, int nbMonths) { return date.plusDays(1).minusMonths(nbMonths).minusDays(1); } public static LocalDate plusMonths(LocalDate date, int nbMonths) { return date.plusDays(1).plusMonths(nbMonths).minusDays(1); } /** * Procdure permettant de tester si aujourd'hui nous sommes dans une priode particulire * * @param date * La date tester * @param dayBegin * Le jour du dbut de la priode * @param monthBegin * Le mois de dbut de la priode * @param dayEnd * Le jour de fin de la priode * @param monthEnd * Le mois de fin de la priode * @return * Sommes-nous dans la priode? */ public static boolean dateInPeriod(LocalDate date, int dayBegin, int monthBegin, int dayEnd, int monthEnd) { if (monthBegin > monthEnd) { if ((date.getMonthOfYear() == monthBegin && date.getDayOfMonth() >= dayBegin) || (date.getMonthOfYear() > monthBegin) || (date.getMonthOfYear() < monthEnd) || (date.getMonthOfYear() == monthEnd && date.getDayOfMonth() <= dayEnd)) { return true; } else { return false; } } else if (monthBegin == monthEnd) { if ((date.getMonthOfYear() == monthBegin && date.getDayOfMonth() >= dayBegin && date.getDayOfMonth() <= dayEnd)) { return true; } else { return false; } } else { if ((date.getMonthOfYear() == monthBegin && date.getDayOfMonth() >= dayBegin) || (date.getMonthOfYear() > monthBegin && date.getMonthOfYear() < monthEnd) || (date.getMonthOfYear() == monthEnd && date.getDayOfMonth() <= dayEnd)) { return true; } else { return false; } } } }