This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git


The following commit(s) were added to refs/heads/master by this push:
     new 328f2aedf Add CalendarUtils.toLocalDateTime(Calendar)
328f2aedf is described below

commit 328f2aedfb8643c3e1e74b5aec9e3628c3cbf2e7
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Wed Aug 21 11:38:20 2024 -0400

    Add CalendarUtils.toLocalDateTime(Calendar)
    
    Add CalendarUtils.toLocalDateTime()
---
 src/changes/changes.xml                            |  2 ++
 .../apache/commons/lang3/time/CalendarUtils.java   | 24 +++++++++++++++++++++-
 .../commons/lang3/time/CalendarUtilsTest.java      | 21 +++++++++++++++++++
 3 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index bcdddf6d0..4bd243ba4 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -56,6 +56,8 @@ The <action> type attribute can be add,update,fix,remove.
     <action                   type="add" dev="ggregory" due-to="Gary 
Gregory">Make RandomUtils.insecure() public.</action>
     <action                   type="add" dev="ggregory" due-to="Gary 
Gregory">Add RandomUtils.secureStrong().</action>
     <action                   type="add" dev="ggregory" due-to="Gary 
Gregory">Add RandomStringUtils.secureStrong().</action>
+    <action                   type="add" dev="ggregory" due-to="Gary 
Gregory">Add CalendarUtils.toLocalDateTime(Calendar).</action>
+    <action                   type="add" dev="ggregory" due-to="Gary 
Gregory">Add CalendarUtils.toLocalDateTime().</action>
     <!-- UPDATE -->
     <action                   type="update" dev="ggregory" due-to="Gary 
Gregory, Dependabot">Bump org.hamcrest:hamcrest from 2.2 to 3.0 #1255.</action>
     <action                   type="update" dev="ggregory" due-to="Gary 
Gregory, Dependabot">Bump org.easymock:easymock from 5.3.0 to 5.4.0 
#1256.</action>
diff --git a/src/main/java/org/apache/commons/lang3/time/CalendarUtils.java 
b/src/main/java/org/apache/commons/lang3/time/CalendarUtils.java
index 0f7906df4..3582c4700 100644
--- a/src/main/java/org/apache/commons/lang3/time/CalendarUtils.java
+++ b/src/main/java/org/apache/commons/lang3/time/CalendarUtils.java
@@ -17,6 +17,7 @@
 
 package org.apache.commons.lang3.time;
 
+import java.time.LocalDateTime;
 import java.util.Calendar;
 import java.util.Locale;
 import java.util.Locale.Category;
@@ -59,6 +60,17 @@ public class CalendarUtils {
         return new CalendarUtils(Calendar.getInstance(locale), locale);
     }
 
+    /**
+     * Converts a Calendar to a LocalDateTime.
+     *
+     * @param calendar the Calendar to convert.
+     * @return a LocalDateTime.
+     * @since 3.17.0
+     */
+    public static LocalDateTime toLocalDateTime(final Calendar calendar) {
+        return LocalDateTime.ofInstant(calendar.toInstant(), 
calendar.getTimeZone().toZoneId());
+    }
+
     private final Calendar calendar;
 
     private final Locale locale;
@@ -71,7 +83,6 @@ public class CalendarUtils {
     public CalendarUtils(final Calendar calendar) {
         this(calendar, Locale.getDefault());
     }
-
     /**
      * Creates an instance for the given Calendar.
      *
@@ -82,6 +93,7 @@ public class CalendarUtils {
         this.calendar = Objects.requireNonNull(calendar, "calendar");
         this.locale = Objects.requireNonNull(locale, "locale");
     }
+
     /**
      * Gets the current day of month.
      *
@@ -151,4 +163,14 @@ public class CalendarUtils {
     public int getYear() {
         return calendar.get(Calendar.YEAR);
     }
+
+    /**
+     * Converts this instance to a {@link LocalDateTime}.
+     *
+     * @return a LocalDateTime.
+     * @since 3.17.0
+     */
+    public LocalDateTime toLocalDateTime() {
+        return toLocalDateTime(calendar);
+    }
 }
diff --git a/src/test/java/org/apache/commons/lang3/time/CalendarUtilsTest.java 
b/src/test/java/org/apache/commons/lang3/time/CalendarUtilsTest.java
index 1faea43f6..6c0af2031 100644
--- a/src/test/java/org/apache/commons/lang3/time/CalendarUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/time/CalendarUtilsTest.java
@@ -19,14 +19,23 @@ package org.apache.commons.lang3.time;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.Calendar;
+import java.util.GregorianCalendar;
 import java.util.Locale;
+import java.util.TimeZone;
 
 import org.apache.commons.lang3.AbstractLangTest;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 
 public class CalendarUtilsTest extends AbstractLangTest {
 
+    private static final String TIME_ZONE_GET_AVAILABLE_IDS = 
"java.util.TimeZone#getAvailableIDs()";
+
     @Test
     public void testGetDayOfMonth() {
         assertEquals(Calendar.getInstance().get(Calendar.DAY_OF_MONTH), 
CalendarUtils.getInstance().getDayOfMonth());
@@ -83,4 +92,16 @@ public class CalendarUtilsTest extends AbstractLangTest {
         assertEquals(Calendar.getInstance().get(Calendar.YEAR), 
CalendarUtils.INSTANCE.getYear());
     }
 
+    @ParameterizedTest
+    @MethodSource(TIME_ZONE_GET_AVAILABLE_IDS)
+    public void testToLocalDateTime(final String id) {
+        final TimeZone timeZone = TimeZone.getTimeZone(id);
+        final ZoneId zoneId = timeZone.toZoneId();
+        final Calendar calendar = new GregorianCalendar(timeZone);
+        calendar.setTimeInMillis(0);
+        assertEquals(LocalDateTime.ofInstant(calendar.toInstant(), 
calendar.getTimeZone().toZoneId()), new 
CalendarUtils(calendar).toLocalDateTime());
+        final ZonedDateTime zdt1 = ZonedDateTime.of(1, 2, 3, 4, 5, 6, 0, 
zoneId);
+        calendar.setTimeInMillis(zdt1.toInstant().toEpochMilli());
+        assertEquals(LocalDateTime.ofInstant(zdt1.toInstant(), 
calendar.getTimeZone().toZoneId()), new 
CalendarUtils(calendar).toLocalDateTime());
+    }
 }

Reply via email to