ca678 1 anno fa
parent
commit
7984a07bdc

+ 41 - 0
assira.commons/src/main/java/net/ranides/assira/time2/DateTimeFormatters.java

@@ -1,13 +1,16 @@
 package net.ranides.assira.time2;
 
 import lombok.experimental.UtilityClass;
+import net.ranides.assira.text.StringUtils;
 import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.format.TextStyle;
 import java.util.Locale;
+import java.util.Objects;
 
 @UtilityClass
 public class DateTimeFormatters {
@@ -49,6 +52,15 @@ public class DateTimeFormatters {
         return formatDate(DateTimeUtils.withZoneUtc(input));
     }
 
+    @ZoneExplicit
+    @Contract("!null -> !null; null -> null")
+    public static @Nullable String formatPolishDate(@Nullable ZonedDate input) {
+        if(Objects.isNull(input)) {
+            return null;
+        }
+        return formatPolishDate(input.withMin());
+    }
+
     @ZoneExplicit
     @Contract("!null -> !null; null -> null")
     public static @Nullable String formatPolishDate(@Nullable ZonedDateTime input) {
@@ -65,6 +77,12 @@ public class DateTimeFormatters {
         return format(DATETIME, input);
     }
 
+    // @todo rename to formatPolishDateHoursMinutes?
+    @Contract("!null -> !null; null -> null")
+    public static @Nullable String formatPolishDateTime(@Nullable ZonedDateTime input) {
+        return format(DATETIME, DateTimeUtils.withZonePolish(input));
+    }
+
     @Contract("!null -> !null; null -> null")
     public static @Nullable String formatDateTimePrecise(@Nullable ZonedDateTime input) {
         return format(DATETIME_PRECISE, input);
@@ -97,6 +115,12 @@ public class DateTimeFormatters {
         return format(YEAR, input);
     }
 
+    @ZoneExplicit
+    @Contract("!null -> !null; null -> null")
+    public static @Nullable String formatPolishYear(@Nullable ZonedDateTime input) {
+        return format(YEAR, DateTimeUtils.withZonePolish(input));
+    }
+
     @Contract("!null -> !null; null -> null")
     public static @Nullable String formatDateShort(@Nullable ZonedDateTime input) {
         return format(DATENAME, input);
@@ -119,12 +143,29 @@ public class DateTimeFormatters {
         return format(DAY_NAME, input);
     }
 
+
+
     @ZoneExplicit
     @Contract("!null -> !null; null -> null")
     public static @Nullable String getPolishDayName(@Nullable ZonedDateTime input) {
         return format(DAY_NAME, LOCALE_PL, input);
     }
 
+    @ZoneExplicit
+    @Contract("_,!null -> !null; _,null -> null")
+    public static @Nullable String getPolishMonthName(@NotNull Locale locale, @Nullable ZonedDateTime input) {
+        if(Objects.isNull(input)) {
+            return null;
+        }
+        return StringUtils.capitalize(input.getMonth().getDisplayName(TextStyle.FULL_STANDALONE, locale));
+    }
+
+    @ZoneExplicit
+    @Contract("!null -> !null; null -> null")
+    public static @Nullable String getPolishMonthName(@Nullable ZonedDateTime input) {
+        return getPolishMonthName(LOCALE_PL, input);
+    }
+
     @ZoneExplicit
     @Contract("!null -> !null; null -> null")
     public static @Nullable String getPolishTime(@Nullable ZonedDateTime input) {

+ 3 - 0
assira.commons/src/main/java/net/ranides/assira/time2/DateTimeLiteral.java

@@ -10,6 +10,9 @@ import java.time.ZonedDateTime;
 @UtilityClass
 public class DateTimeLiteral {
 
+    public static final ZonedDateTime MIN = datetimeUtc(1900, 1, 1, 0, 0, 0);
+    public static final ZonedDateTime MAX = datetimeUtc(4000, 1, 1, 0, 0, 0);
+
     public static ZonedTime time(ZoneId zone, int h, int m, int s) {
         return ZonedTime.of(zone, LocalTime.of(h, m, s));
     }

+ 1 - 6
assira.commons/src/main/java/net/ranides/assira/time2/DateTimeParsers.java

@@ -5,12 +5,7 @@ import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.OffsetTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
 import java.time.temporal.TemporalAccessor;

+ 37 - 0
assira.commons/src/main/java/net/ranides/assira/time2/DateTimeUtils.java

@@ -98,6 +98,7 @@ public class DateTimeUtils {
         return date1.isAfter(date2) ? date1 : date2;
     }
 
+    // @todo test if we process correctly different timezones
     @Contract("!null,null -> false; null,!null -> false; null,null -> false")
     public static boolean isSameDate(@Nullable ZonedDateTime dateTime1, @Nullable ZonedDateTime dateTime2) {
         if(Objects.isNull(dateTime1) != Objects.isNull(dateTime2)) {
@@ -177,6 +178,18 @@ public class DateTimeUtils {
         return (Objects.isNull(begin) || !begin.isAfter(input)) && (Objects.isNull(end) || !end.isBefore(input));
     }
 
+    @Contract("_, null -> true")
+    public static boolean isBefore(@NotNull ZonedDateTime input, @Nullable ZonedDateTime begin) {
+        Objects.requireNonNull(input);
+        return Objects.isNull(begin) || input.isBefore(begin);
+    }
+
+    @Contract("_, null -> true")
+    public static boolean isAfter(@NotNull ZonedDateTime input, @Nullable ZonedDateTime end) {
+        Objects.requireNonNull(input);
+        return Objects.isNull(end) || end.isAfter(input);
+    }
+
     @ZoneHazard
     public static ZonedDateTime asDateTime(@NotNull ZonedDate date, @NotNull ZonedTime time) {
         Objects.requireNonNull(date);
@@ -202,11 +215,13 @@ public class DateTimeUtils {
 
     @Contract("null -> false")
     public static boolean hasMinTime(@Nullable ZonedDateTime datetime) {
+        // @todo truncate to millis or seconds
         return Objects.nonNull(datetime) && LocalTime.MIN.equals(datetime.toLocalTime());
     }
 
     @Contract("null -> false")
     public static boolean hasMaxTime(@Nullable ZonedDateTime datetime) {
+        // @todo truncate to millis or seconds
         return Objects.nonNull(datetime) && LocalTime.MAX.equals(datetime.toLocalTime());
     }
 
@@ -222,6 +237,24 @@ public class DateTimeUtils {
         return Objects.nonNull(datetime) && LocalTime.MAX.equals(withZonePolish(datetime).toLocalTime());
     }
 
+    @ZoneExplicit
+    @Contract("null -> null; !null -> !null")
+    public static @Nullable ZonedDateTime withPolishMinTime(@Nullable ZonedDateTime datetime) {
+        if(Objects.isNull(datetime)) {
+            return null;
+        }
+        return withZonePolish(datetime).with(LocalTime.MIN);
+    }
+
+    @ZoneExplicit
+    @Contract("null -> null; !null -> !null")
+    public static @Nullable ZonedDateTime withPolishMaxTime(@Nullable ZonedDateTime datetime) {
+        if(Objects.isNull(datetime)) {
+            return null;
+        }
+        return withZonePolish(datetime).with(LocalTime.MAX);
+    }
+
     @Deprecated
     @Contract("null -> null; !null -> !null")
     public static @Nullable ZonedDateTime withLastDayOfMonth(@Nullable ZonedDateTime datetime) {
@@ -256,4 +289,8 @@ public class DateTimeUtils {
         return isSunday(withZonePolish(datetime));
     }
 
+    @Deprecated
+    public static boolean isHoliday(ZonedDateTime day) {
+        return false;
+    }
 }

+ 0 - 1
assira.commons/src/main/java/net/ranides/assira/time2/ZoneExplicit.java

@@ -7,7 +7,6 @@ import java.lang.annotation.RetentionPolicy;
 /**
  * Marked method explicitly enforces specific timezone.
  *
- *
  * Please be very careful about the code using annotated method because
  * Annotated method . In most computations you don't need to use that information.
  *

+ 1 - 1
assira.commons/src/main/java/net/ranides/assira/time2/ZonedDate.java

@@ -180,7 +180,7 @@ public abstract class ZonedDate implements Comparable<ZonedDate> {
         return plus(months, ChronoUnit.MONTHS);
     }
 
-    public final ZonedDate plusDays(int days) {
+    public final ZonedDate plusDays(long days) {
         return plus(days, ChronoUnit.DAYS);
     }
 

+ 1 - 5
assira.commons/src/main/java/net/ranides/assira/time2/ZonedTime.java

@@ -8,11 +8,7 @@ import net.ranides.assira.time2.json.ZonedTimeSerializer;
 import org.jetbrains.annotations.NotNull;
 
 import java.sql.Timestamp;
-import java.time.Duration;
-import java.time.Instant;
-import java.time.LocalTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
+import java.time.*;
 import java.time.temporal.ChronoField;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalField;