import java.time.*;
import java.time.format.*;
import java.time.temporal.*;

public class DateTimeUtils {
    
    // Get current date
    public static LocalDate getCurrentDate() {
        return LocalDate.now();
    }
    
    // Get current time
    public static LocalTime getCurrentTime() {
        return LocalTime.now();
    }
    
    // Get current date-time
    public static LocalDateTime getCurrentDateTime() {
        return LocalDateTime.now();
    }
    
    // Create date
    public static LocalDate createDate(int year, int month, int day) {
        return LocalDate.of(year, month, day);
    }
    
    // Create time
    public static LocalTime createTime(int hour, int minute) {
        return LocalTime.of(hour, minute);
    }
    
    // Parse date from string
    public static LocalDate parseDate(String dateStr) {
        return LocalDate.parse(dateStr);
    }
    
    // Format date to string
    public static String formatDate(LocalDate date, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return date.format(formatter);
    }
    
    // Add days
    public static LocalDate addDays(LocalDate date, long days) {
        return date.plusDays(days);
    }
    
    // Calculate difference in days
    public static long daysBetween(LocalDate date1, LocalDate date2) {
        return ChronoUnit.DAYS.between(date1, date2);
    }
    
    // Get start of day
    public static LocalDateTime startOfDay(LocalDate date) {
        return date.atStartOfDay();
    }
    
    // Convert to Instant
    public static Instant toInstant(LocalDateTime dateTime, ZoneId zoneId) {
        return dateTime.atZone(zoneId).toInstant();
    }
    
    // Get duration between times
    public static Duration durationBetween(LocalTime time1, LocalTime time2) {
        return Duration.between(time1, time2);
    }
}