Collections.sort(allValidPeriods, new Comparator<CheckInPeriod>() {
public int compare(CheckInPeriod o1, CheckInPeriod o2) {
return o2.priority.compareTo(o1.priority);
if (allValidPeriods.isEmpty()) {
result.add(allValidPeriods.get(0));
for (CheckInPeriod cip : allValidPeriods) {
CheckInPeriod first = result.getFirst();
if (cip.periodFrom.before(first.periodFrom)) {
if (!cip.cid.equals(first.cid) || !cip.cod.equals(first.cod) || !cip.agencyMinimum.equals(first.agencyMinimum) || cip.periodTo.before(first.periodFrom)) {
CheckInPeriod c = new CheckInPeriod(cip);
if (!cip.periodTo.before(first.periodFrom)) {
c.periodTo = first.periodFrom;
result.getFirst().periodFrom = cip.periodFrom;
CheckInPeriod last = result.getLast();
if (cip.periodTo.after(last.periodTo)) {
if (!cip.cid.equals(last.cid) || !cip.cod.equals(last.cod) || cip.periodFrom.after(last.periodTo)) {
CheckInPeriod c = new CheckInPeriod(cip);
if (!cip.periodFrom.after(last.periodTo)) {
c.periodFrom = last.periodTo;
result.getLast().periodTo = cip.periodTo;
CheckInPeriod former = result.getFirst();
ListIterator<CheckInPeriod> iterator = result.listIterator();
while (iterator.hasNext()) {
CheckInPeriod c = iterator.next();
if (c.periodTo.after(cip.periodTo)) {
if (DateUtils.getDaysBetween2(former.periodTo, c.periodFrom) > 1 && former.periodTo.before(c.periodFrom) && cip.periodFrom.before(c.periodFrom)) {
CheckInPeriod gap = new CheckInPeriod(cip);
gap.periodFrom = DateUtils.addDays(former.periodTo, 1);
gap.periodTo = DateUtils.addDays(c.periodFrom, -1);
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.function.Predicate;
import org.joda.time.LocalDate;
public class FindPriorityPeriodsList {
Predicate<Object> mergeConditions;
public FindPriorityPeriodsList(Date periodFrom, Date periodTo, Integer priority) {
this.periodFrom = periodFrom;
this.periodTo = periodTo;
this.priority = priority;
public FindPriorityPeriodsList(FindPriorityPeriodsList FPPL) {
this.periodFrom = FPPL.periodFrom;
this.periodTo = FPPL.periodTo;
this.priority = FPPL.priority;
public boolean mergeConditions(Object o) {
if (!(o instanceof FindPriorityPeriodsList)) {
public static void main(String args[]) {
List<FindPriorityPeriodsList> testFindPriorityPeriodsList = new ArrayList<>();
Date periodFrom = new Date(2022, 1, 2);
Date periodTo = new Date(2022, 1, 4);
FindPriorityPeriodsList testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
periodFrom = new Date(2022, 1, 3);
periodTo = new Date(2022, 1, 6);
testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
periodFrom = new Date(2022, 1, 1);
periodTo = new Date(2022, 1, 5);
testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
periodFrom = new Date(2022, 1, 3);
periodTo = new Date(2022, 1, 7);
testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
periodFrom = new Date(2022, 1, 2);
periodTo = new Date(2022, 1, 10);
testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
LinkedList<FindPriorityPeriodsList> resultOfTest = priorityPeriodsList(testFindPriorityPeriodsList);
System.out.println("result");
public static int randomNumber(int min, int max) {
return min + (int) (Math.random() * ((max - min) + 1));
public static Date randomDate(int min, int max) {
int year = randomNumber(min, max);
int dayOfYear = randomNumber(1, 10);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.DAY_OF_YEAR, dayOfYear);
return calendar.getTime();
package hr.stratusit.cbms.commonNew;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.TimeZone;
import org.joda.time.DateTime;
public static Integer getWeeksBetweenLow(Date from, Date to) {
Integer result = getDaysBetween(from, to);
public static Integer getWeeksBetweenHigh(Date from, Date to) {
Integer result = getDaysBetween(from, to);
result = (result / 7) + 1;
public static Integer getDaysInMonth(int month, int year) {
return getLastDayOfMonth(month, year);
public static int getAgeOfPerson(Date dateOfBirth) {
Calendar dob = Calendar.getInstance();
dob.setTime(dateOfBirth);
Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (today.get(Calendar.MONTH) < dob.get(Calendar.MONTH)) {
} else if (today.get(Calendar.MONTH) == dob.get(Calendar.MONTH)
&& today.get(Calendar.DAY_OF_MONTH) < dob.get(Calendar.DAY_OF_MONTH)) {
public static Date getNormalizedDate(Date date) {
SimpleDateFormat oldFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return isoFormat.parse(oldFormat.format(date));
public static boolean isDateBetween(Date date, Date from, Date to) {
date = setZeroHour(date);
from = setZeroHour(from);
return ((date.compareTo(from) >= 0) && (date.compareTo(to) <= 0));
public static int getHoursBetween(Date from, Date to) {
long time1 = from.getTime();
long time2 = to.getTime();
long diff = time2 - time1;
return (int) (diff / 1000 / 60 / 60);
public static Date setZeroHour(Date date) {
DateTime dt = new DateTime(date);
return dt.millisOfDay().setCopy(0).toDate();
public static Date set12Hour(Date date) {
DateTime dt = new DateTime(date);
return dt.millisOfDay().setCopy(12 * 3600 * 1000).toDate();
public static Date set24Hour(Date date) {
DateTime dt = new DateTime(date);
DateTime result = new DateTime(dt.getYear(), dt.getMonthOfYear(), dt.getDayOfMonth(), 23, 59, 59, 0);
public static Date getStartDate(int month, int year) {
DateTime dt = new DateTime(year, month, 1, 0, 0, 0, 0);
public static Date getEndDate(int month, int year) {
DateTime dt = new DateTime(year, month, 1, 0, 0, 0, 0);
return dt.dayOfMonth().withMaximumValue().toDate();
public static Date addDays(Date date, int days) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, days);
public static boolean areDatesTheSame(Date date1, Date date2) {
if (date1 == null || date2 == null) {
DateTime dt1 = new DateTime(date1);
dt1 = dt1.withMillisOfDay(0);
DateTime dt2 = new DateTime(date2);
dt2 = dt2.withMillisOfDay(0);
public static boolean arePeriodsOverlapping(Date date1from, Date date1to, Date date2from, Date date2to){
if(!set12Hour(date1from).after(set12Hour(date2to)) && !set12Hour(date1to).before(set12Hour(date2from))){
public static Integer getDaysBetween(Date from, Date to) {
Long fromMsec = from.getTime();
Long toMsec = to.getTime();
return convertMilisecondsToDays(toMsec - fromMsec);
public static Integer convertMilisecondsToDays(Long miliseconds) {
BigDecimal result = new BigDecimal(miliseconds);
return result.divide(BigDecimal.valueOf(1000 * 60 * 60 * 24), 0, RoundingMode.UP).intValue();
public static Integer getDaysBetween2(Date from, Date to) {
Long fromMsec = set12Hour(from).getTime();
Long toMsec = set12Hour(to).getTime();
return convertMilisecondsToDays2(toMsec - fromMsec);
public static Integer convertMilisecondsToDays2(Long miliseconds) {
BigDecimal result = new BigDecimal(miliseconds);
result = result.divide(BigDecimal.valueOf(1000), RoundingMode.HALF_UP);
result = result.divide(BigDecimal.valueOf(60), RoundingMode.HALF_UP);
result = result.divide(BigDecimal.valueOf(60), RoundingMode.HALF_UP);
result = result.divide(BigDecimal.valueOf(24), RoundingMode.HALF_UP);
return result.setScale(0, RoundingMode.HALF_UP).intValue();
public static Integer getWeeksBetween(Date from, Date to) {
Integer result = getDaysBetween(from, to);
public static Integer getYearsBetween(Date from, Date to) {
Integer result = getWeeksBetween(from, to);
public static Integer getLastDayOfMonth(Integer month, Integer year) {
return new DateTime(getEndDate(month, year)).getDayOfMonth();
public static String dateToString(Date date, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.ENGLISH);
result = sdf.format(date);
public static String dateToString(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy'T'HH:mm:ss");
result = sdf.format(date);
public static String dateToString(Date date, String pattern, Locale locale) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern, locale);
result = sdf.format(date);
public static Date stringToDate(String date, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
} catch (ParseException ex) {
public static String getLocalizedNameOfDay(int day, Locale locale) {
if (locale.getLanguage().equals("hr")) {
} else if (locale.getLanguage().equals("it")) {
} else if (locale.getLanguage().equals("de")) {
if (locale.getLanguage().equals("hr")) {
} else if (locale.getLanguage().equals("it")) {
} else if (locale.getLanguage().equals("de")) {
if (locale.getLanguage().equals("hr")) {
} else if (locale.getLanguage().equals("it")) {
} else if (locale.getLanguage().equals("de")) {
if (locale.getLanguage().equals("hr")) {
} else if (locale.getLanguage().equals("it")) {
} else if (locale.getLanguage().equals("de")) {
if (locale.getLanguage().equals("hr")) {
} else if (locale.getLanguage().equals("it")) {
} else if (locale.getLanguage().equals("de")) {
if (locale.getLanguage().equals("hr")) {
} else if (locale.getLanguage().equals("it")) {
} else if (locale.getLanguage().equals("de")) {
if (locale.getLanguage().equals("hr")) {
} else if (locale.getLanguage().equals("it")) {
} else if (locale.getLanguage().equals("de")) {
public static boolean firstDatePeriodIsInSecondDatePeriod(Date from, Date to, Date periodFrom, Date periodTo) {
final long timeFrom = from.getTime();
final long timePeriodFrom = periodFrom.getTime();
final long timeTo = to.getTime();
final long timePeriodTo = periodTo.getTime();
if (timeFrom <= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodTo && timeTo <= timePeriodTo) {
if (timeFrom >= timePeriodTo && timeFrom <= timePeriodTo
&& timeTo >= timePeriodFrom && timeTo >= timePeriodTo) {
if (timeFrom >= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodFrom && timeTo <= timePeriodTo) {
if (timeFrom <= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodFrom && timeTo >= timePeriodTo) {
public static boolean firstDatePeriodIsInSecondDatePeriodWithCorners(Date from, Date to, Date periodFrom, Date periodTo) {
final long timeFrom = from.getTime();
final long timePeriodFrom = periodFrom.getTime();
final long timeTo = to.getTime();
final long timePeriodTo = periodTo.getTime();
if (timeFrom <= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodTo && timeTo <= timePeriodTo) {
if (timeFrom > timePeriodTo && timeFrom < timePeriodTo
&& timeTo > timePeriodFrom && timeTo > timePeriodTo) {
if (timeFrom >= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodFrom && timeTo <= timePeriodTo) {
if (timeFrom <= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodFrom && timeTo >= timePeriodTo) {
public static boolean dateInputContainsInDatePeriod(Date from, Date to, Date periodFrom, Date periodTo) {
final long timeFrom = from.getTime();
final long timePeriodFrom = periodFrom.getTime();
final long timeTo = to.getTime();
final long timePeriodTo = periodTo.getTime();
if (timeFrom <= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodFrom && timeTo <= timePeriodTo) {
if (timeFrom >= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodFrom && timeTo <= timePeriodTo) {
if (timeFrom >= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodFrom && timeTo >= timePeriodTo) {
if (timeFrom <= timePeriodFrom && timeFrom <= timePeriodTo
&& timeTo >= timePeriodFrom && timeTo >= timePeriodTo) {
public static String dateArrayToString(List<Date> possibleAllocDates, String pattern) {
if (possibleAllocDates == null || possibleAllocDates.isEmpty()) {
StringBuilder dateArray = new StringBuilder();
for (Date date : possibleAllocDates) {
dateArray.append(dateToString(date, pattern));
dateArray.deleteCharAt(dateArray.length() - 1);
return dateArray.toString();
public static DateTime toFirstSecondOfDay(Date date) {
return new DateTime(date).withTimeAtStartOfDay().plusSeconds(1);
public static DateTime toLastSecondOfDay(Date date) {
return new DateTime(date).withTimeAtStartOfDay().plusDays(1).minusSeconds(1);
public static Date StringToDate(String date, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
} catch (ParseException ex) {
public static String dateToStringWithLocale(Date date, Locale locale) {
SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy", locale);
public static int resolveJavascriptBookingDay(int bookingDay) {
public static int convertCalendarDayToJodaDay(int day) {
return ((day + 5) % 7) + 1;
public static int convertJodaDayToCalendarDay(int day){
public static String getDayOfWeek(java.util.Date date, Locale locale) {
return getDayOfWeek(date.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate(), locale);
public static String getDayOfWeek(java.time.LocalDate date, Locale locale) {
java.time.DayOfWeek day = date.getDayOfWeek();
return day.getDisplayName(java.time.format.TextStyle.FULL, locale);
public static java.time.LocalDate convertDateToJavaTimeLocalDate(Date date) {
.atZone(ZoneId.systemDefault())
public static Date convertJavaTimeLocalDateToDate(java.time.LocalDate date) {
return Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());
public static java.time.LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) {
return dateToConvert.toInstant()
.atZone(ZoneId.systemDefault())
public static Date convertToDateViaInstant(java.time.LocalDateTime dateToConvert) {
.from(dateToConvert.atZone(ZoneId.systemDefault())
public static boolean isPeriodOverlaping(Date from1, Date to1, Date from2, Date to2){
return !from1.after(to2) && !to1.before(from2);
package hr.stratusit.mavenproject1;
import hr.stratusit.cbms.commonNew.DateUtils;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.function.Predicate;
public class FindPriorityPeriodsList {
Predicate<Object> mergeConditions;
public FindPriorityPeriodsList(Date periodFrom, Date periodTo, Integer priority) {
this.periodFrom = periodFrom;
this.periodTo = periodTo;
this.priority = priority;
public FindPriorityPeriodsList(FindPriorityPeriodsList FPPL) {
this.periodFrom = FPPL.periodFrom;
this.periodTo = FPPL.periodTo;
this.priority = FPPL.priority;
public boolean mergeConditions(Object o) {
if (!(o instanceof FindPriorityPeriodsList)) {
public static void main(String args[]) {
List<FindPriorityPeriodsList> testFindPriorityPeriodsList = new ArrayList<>();
Date periodFrom = new Date(2022, 1, 2);
Date periodTo = new Date(2022, 1, 4);
FindPriorityPeriodsList testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
periodFrom = new Date(2022, 1, 3);
periodTo = new Date(2022, 1, 6);
testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
periodFrom = new Date(2022, 1, 1);
periodTo = new Date(2022, 1, 5);
testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
periodFrom = new Date(2022, 1, 3);
periodTo = new Date(2022, 1, 7);
testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
periodFrom = new Date(2022, 1, 2);
periodTo = new Date(2022, 1, 10);
testObject = new FindPriorityPeriodsList(periodFrom, periodTo, random);
testFindPriorityPeriodsList.add(testObject);
LinkedList<FindPriorityPeriodsList> resultOfTest = priorityPeriodsList(testFindPriorityPeriodsList);
System.out.println("result");
public static int randomNumber(int min, int max) {
return min + (int) (Math.random() * ((max - min) + 1));
public static Date randomDate(int min, int max) {
int year = randomNumber(min, max);
int dayOfYear = randomNumber(1, 10);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.DAY_OF_YEAR, dayOfYear);
return calendar.getTime();
private static LinkedList<FindPriorityPeriodsList> priorityPeriodsList(List<FindPriorityPeriodsList> listOfPeriods) {
LinkedList<FindPriorityPeriodsList> result = new LinkedList<>();
Collections.sort(listOfPeriods, new Comparator<FindPriorityPeriodsList>() {
public int compare(FindPriorityPeriodsList o1, FindPriorityPeriodsList o2) {
return o2.priority.compareTo(o1.priority);
if (listOfPeriods.isEmpty()) {
result.add(listOfPeriods.get(0));
FindPriorityPeriodsList c;
for (FindPriorityPeriodsList cip : listOfPeriods) {
FindPriorityPeriodsList first = result.getFirst();
if (cip.periodFrom.before(first.periodFrom)) {
c = new FindPriorityPeriodsList(cip);
if (cip.periodTo.before(first.periodFrom)) {
c.periodFrom = cip.periodFrom;
c.periodTo= cip.periodTo;
FindPriorityPeriodsList last = result.getLast();
if (cip.periodTo.after(last.periodTo)) {
c = new FindPriorityPeriodsList(cip);
if (cip.periodFrom.after(last.periodTo)) {
c.periodFrom = last.periodTo;
c.periodTo= cip.periodTo;
FindPriorityPeriodsList former = result.getFirst();
ListIterator<FindPriorityPeriodsList> iterator = result.listIterator();
while (iterator.hasNext()) {
if (c.periodTo.after(cip.periodTo)) {
if (!(DateUtils.getDaysBetween2(former.periodTo, c.periodFrom) > 1 && former.periodTo.before(c.periodFrom) && cip.periodFrom.before(c.periodFrom))) {
FindPriorityPeriodsList gap = new FindPriorityPeriodsList(cip);
gap.periodFrom = DateUtils.addDays(former.periodTo, 1);
gap.periodTo = DateUtils.addDays(c.periodFrom, -1);