package net.gepafin.tendermanagement.util; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Calendar; import java.util.Date; import java.util.regex.Pattern; @Component public class DateTimeUtil { private static final Pattern TIME_PATTERN = Pattern.compile( "^((([01]?\\d|2[0-3]):([0-5]\\d)(:[0-5]\\d)?(\\s?[AP]M)?)|((0?[1-9]|1[0-2]):([0-5]\\d)(:[0-5]\\d)?\\s?[AP]M))$"); public static LocalDateTime DateServerToUTC(LocalDateTime systemDate) { ZonedDateTime ldtZoned = systemDate.atZone(ZoneId.systemDefault()); LocalDateTime localDatetime = ldtZoned.withZoneSameInstant(ZoneId.of("Europe/Rome")).toLocalDateTime(); return localDatetime; } public static LocalDateTime getPreviousMonthDate(int month) { Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, -month); LocalDateTime conv = LocalDateTime.ofInstant(c.getTime().toInstant(), ZoneId.systemDefault()); return conv; } public static Date getDateWithoutTime(LocalDateTime systemDate) { ZonedDateTime zdt = systemDate.atZone(ZoneId.systemDefault()); Date date = Date.from(zdt.toInstant()); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); 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 LocalDateTime convertDateToLocalDateTime(Date date) { LocalDateTime ldt = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); return ldt; } public static Date convertLocalDateTimeToDateUsingInstant(LocalDateTime localDateTime) { return Date .from(localDateTime.atZone(ZoneId.systemDefault()) .toInstant()); } public static LocalTime parseTime(String timeString) throws DateTimeParseException { DateTimeFormatter formatter; if(timeString==null) { return null; } if (!TIME_PATTERN.matcher(timeString).matches()) { throw new CustomValidationException(Status.BAD_REQUEST,"Invalid time format: " + timeString); } // Try to parse using default formats if no format is provided String[] defaultFormats = {"HH:mm:ss", "HH:mm", "HH:mm:ss a", "hh:mm a"}; for (String defaultFormat : defaultFormats) { formatter = DateTimeFormatter.ofPattern(defaultFormat); try { return LocalTime.parse(timeString, formatter); } catch (DateTimeParseException e) { // Continue to the next format } } // If all parsing attempts fail, throw an exception throw new CustomValidationException(Status.BAD_REQUEST,"Failed to parse time: " + timeString); } public static String formatLocalDateTime(LocalDateTime dateTime, String pattern) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); return dateTime.format(formatter); } public static LocalDateTime parseStringToLocalDateTime(String dateTimeStr, String pattern) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); return LocalDateTime.parse(dateTimeStr, formatter); } public static String parseLocalTimeToString(LocalTime time, String format) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); return time.format(formatter); } // Method 2: Convert String and format to LocalTime public static LocalTime parseStringToLocalTime(String timeString, String format) { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); return LocalTime.parse(timeString, formatter); } catch (DateTimeParseException e) { System.out.println("Invalid time format: " + e.getMessage()); return null; } } public static String formatCreatedDate(LocalDateTime createdDate) { if (createdDate == null) { return ""; } DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); return createdDate.format(formatter); } }