package io.budgetapp.util; import java.net.URI; import java.net.URISyntaxException; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.TextStyle; import java.time.temporal.ChronoField; import java.util.Calendar; import java.util.Date; import java.util.Locale; /** * Util methods */ public class Util { private Util(){} public static Date yearMonthDate(int month, int year) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month - 1); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } public static Date currentYearMonth() { LocalDate now = LocalDate.now(); return yearMonthDate(now.getMonthValue(), now.getYear()); } public static LocalDate toLocalDate(Date date) { Instant instant = Instant.ofEpochMilli(date.getTime()); return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate(); } public static Date toDate(String isoDate) { return toDate(LocalDate.parse(isoDate)); } public static Date toDate(LocalDate localDate) { Instant instantDay = localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant(); return Date.from(instantDay); } public static boolean betweenDate(Date check, Date start, Date end) { // convert to date since we compare date only LocalDate checkDate = toLocalDate(check); LocalDate startDate = toLocalDate(start); LocalDate endDate = toLocalDate(end); return !checkDate.isBefore(startDate) && !checkDate.isAfter(endDate); } /** * check <code>date</code> is same year and month as <code>month</code> or not * @param check * @param month * @return */ public static boolean inMonth(Date check, Date month) { LocalDate checkDate = toLocalDate(check); LocalDate monthDate = toLocalDate(month); return checkDate.getYear() == monthDate.getYear() && checkDate.getMonthValue() == monthDate.getMonthValue(); } public static int yesterday(LocalDate date) { return date.minusDays(1).getDayOfMonth(); } public static int lastWeek(LocalDate date) { return date.minusWeeks(1).get(ChronoField.ALIGNED_WEEK_OF_YEAR); } public static int lastMonth(LocalDate date) { return date.minusMonths(1).getMonthValue(); } public static String toFriendlyMonthDisplay(Date date) { return Util.toLocalDate(date).getMonth().getDisplayName(TextStyle.SHORT, Locale.getDefault()); } public static URI getDatabaseURL(String env) { try { return new URI(System.getenv(env)); } catch (URISyntaxException e) { throw new RuntimeException(e.getMessage(), e); } } }