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

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit eb53ae235a6980661f8f4ef814f6510ed2da2330
Author: Alex Heneveld <[email protected]>
AuthorDate: Wed Oct 20 16:51:43 2021 +0100

    support instance and add ISO 8601 methods and time zones Z with Time methods
    
    (will be used for json/yaml serialization and deserialization)
---
 .../java/org/apache/brooklyn/util/time/Time.java   | 93 +++++++++++++++++++++-
 .../org/apache/brooklyn/util/time/TimeTest.java    | 28 ++++++-
 2 files changed, 116 insertions(+), 5 deletions(-)

diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java 
b/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java
index bd7d49a..9386705 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java
@@ -22,6 +22,9 @@ import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.ParsePosition;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
@@ -83,12 +86,22 @@ public class Time {
         return makeDateString(date, DATE_FORMAT_PREFERRED);
     }
     /** as {@link #makeDateString(Date, String, TimeZone)} for the local time 
zone */
-    public static String makeDateString(Date date, String format) {
+    public static String makeDateString(Date date, @Nullable String format) {
         return makeDateString(date, format, null);
     }
-    /** as {@link #makeDateString(Date, String, TimeZone)} for the given time 
zone; consider {@link TimeZone#GMT} */
-    public static String makeDateString(Date date, String format, @Nullable 
TimeZone tz) {
-        SimpleDateFormat fmt = new SimpleDateFormat(format);
+    public static String makeDateStringUtc(Date date, String format) {
+        return makeDateString(date, format, TimeZone.getTimeZone("UTC"));
+    }
+    public static String makeDateStringUtc(Date date) {
+        return makeDateString(date, TimeZone.getTimeZone("UTC"));
+    }
+    public static String makeDateString(Date date, @Nullable TimeZone tz) {
+        return makeDateString(date, null, null);
+    }
+    /** as {@link #makeDateString(Date, String, TimeZone)} for the given time 
zone; consider {@link TimeZone#getTimeZone(String)} with "GMT" */
+    public static String makeDateString(Date date, @Nullable String format, 
@Nullable TimeZone tz) {
+        SimpleDateFormat fmt = new SimpleDateFormat(format!=null ? format :
+                tz==null ? DATE_FORMAT_PREFERRED : DATE_FORMAT_PREFERRED_W_TZ);
         if (tz!=null) fmt.setTimeZone(tz);
         return fmt.format(date);
     }
@@ -101,6 +114,20 @@ public class Time {
         return makeDateString(date.getTime(), format, date.getTimeZone());
     }
 
+    /** as {@link #makeDateString(Date)} with the given format*/
+    public static String makeDateString(Instant date, String format, Locale 
locale, ZoneId zone) {
+        DateTimeFormatter fmt = 
DateTimeFormatter.ofPattern(format).withLocale(locale==null ? Locale.ROOT : 
locale).withZone(zone==null ? ZoneId.of("UTC") : zone);
+        return fmt.format(date);
+    }
+    /** as {@link #makeDateString(Date)} with the simple preferred format (no 
TZ), dropping trailing zero millis and seconds */
+    public static String makeDateString(Instant date) {
+        String result = makeDateString(date, DATE_FORMAT_PREFERRED, null, 
null);
+        result = Strings.removeFromEnd(result, ".000");
+        result = Strings.removeFromEnd(result, ":00");
+        return result;
+    }
+
+
     public static Function<Long, String> toDateString() {
         return dateString;
     }
@@ -119,6 +146,60 @@ public class Time {
         return makeDateStampString(System.currentTimeMillis());
     }
 
+    /** as {@link #makeDateStampString()} with 'Z' at the end to indicate UTC 
*/
+    public static String makeDateStampStringZ() {
+        return makeDateStampString(System.currentTimeMillis())+"Z";
+    }
+
+    /** as {@link #makeDateStampString()}, with millis and possibly seconds 
removed if 0, with 'Z' at the end to indicate UTC */
+    public static String makeDateStampStringZ(Instant instant) {
+        String s = makeDateStampString(instant.toEpochMilli());
+        if (s.endsWith("000")) {
+            s = Strings.removeFromEnd(s, "000");
+            s = Strings.removeFromEnd(s, "00");
+        }
+        return s+"Z";
+    }
+
+    /** as {@link #makeDateStampString()}, with millis and possibly seconds 
removed if 0, with 'Z' at the end to indicate UTC */
+    public static String makeDateStampStringZ(Date date) {
+        String s = makeDateStampString(date.getTime());
+        if (s.endsWith("000")) {
+            s = Strings.removeFromEnd(s, "000");
+            s = Strings.removeFromEnd(s, "00");
+        }
+        return s+"Z";
+    }
+
+    public static String makeIso8601DateString() {
+        return replaceZeroZoneWithZ(makeIso8601DateStringLocal(Instant.now()));
+    }
+
+    /** ISO 8601 format for UTC */
+    public static String makeIso8601DateStringZ(Instant instant) {
+        return replaceZeroZoneWithZ(makeDateString(instant, 
DATE_FORMAT_ISO8601, null, null));
+    }
+
+    private static String replaceZeroZoneWithZ(String s) {
+        if (s==null) return s;
+        String sz = null;
+        if (s.endsWith("+0000")) sz = Strings.removeFromEnd(s, "+0000");
+        else if (s.endsWith("+00:00")) sz = Strings.removeFromEnd(s, "+00:00");
+        if (sz==null) return s;
+        return sz+"Z";
+    }
+
+    /** ISO 8601 format for local */
+    public static String makeIso8601DateStringLocal(Instant instant) {
+        return makeDateString(instant, DATE_FORMAT_ISO8601, 
Locale.getDefault(), ZoneId.systemDefault());
+    }
+
+    /** ISO 8601 format for UTC */
+    public static String makeIso8601DateString(Date date) {
+        return replaceZeroZoneWithZ(makeDateStringUtc(date, 
DATE_FORMAT_ISO8601));
+    }
+
+
     /** returns the time in {@value #DATE_FORMAT_STAMP} format, given a long 
(e.g. returned by System.currentTimeMillis);
      * cf {@link #makeDateStampString()} */
     public static String makeDateStampString(long date) {
@@ -573,6 +654,10 @@ public class Time {
         return parseCalendarMaybe(input).get().getTime();
     }
 
+    public static Instant parseInstant(@Nullable String input) {
+        return parseCalendarMaybe(input).get().toInstant();
+    }
+
     /** Parses dates from string, accepting many formats including ISO-8601 
and http://yaml.org/type/timestamp.html, 
      * e.g. 2015-06-15 16:00:00 +0000.
      * <p>
diff --git 
a/utils/common/src/test/java/org/apache/brooklyn/util/time/TimeTest.java 
b/utils/common/src/test/java/org/apache/brooklyn/util/time/TimeTest.java
index beeb5d1..7334484 100644
--- a/utils/common/src/test/java/org/apache/brooklyn/util/time/TimeTest.java
+++ b/utils/common/src/test/java/org/apache/brooklyn/util/time/TimeTest.java
@@ -18,6 +18,10 @@
  */
 package org.apache.brooklyn.util.time;
 
+import java.time.Instant;
+import java.time.ZoneId;
+import java.util.GregorianCalendar;
+import java.util.Locale;
 import static org.testng.Assert.assertTrue;
 
 import java.util.Date;
@@ -304,7 +308,10 @@ public class TimeTest {
         assertDatesParseToEqual("20150604-080012.345", 
"2015-06-04-080012.345");
         assertDatesParseToEqual("2015-12-1", "2015-12-01-0000");
         assertDatesParseToEqual("1066-12-1", "1066-12-01-0000");
-        
+
+        assertDatesParseToEqual("20150604-0800", "2015-06-04 08:00:00");
+        assertDatesParseToEqual("20150604-0800Z", "2015-06-04 08:00:00 +0000");
+
         assertDatesParseToEqual("20150604T080012.345", 
"2015-06-04-080012.345");
         assertDatesParseToEqual("20150604T080012.345Z", 
"2015-06-04-080012.345+0000");
         assertDatesParseToEqual("20150604t080012.345 Z", 
"2015-06-04-080012.345+0000");
@@ -405,4 +412,23 @@ public class TimeTest {
             prev = val;
         }
     }
+
+    @Test
+    public void testInstantString() {
+        GregorianCalendar calendar = new 
GregorianCalendar(TimeZone.getTimeZone("UTC"), Locale.ROOT);
+        calendar.set(2020, 0, 1, 12, 0, 0);
+        calendar.set(GregorianCalendar.MILLISECOND, 0);
+        Instant instant = calendar.toInstant();
+        Assert.assertEquals(Time.makeDateString(instant), "2020-01-01 12:00");
+
+        Assert.assertEquals(Time.makeDateStampStringZ(instant), 
"20200101-1200Z");
+        Assert.assertEquals(Time.parseInstant("20200101-1200Z"), instant);
+    }
+
+    @Test
+    public void testIso() {
+        Instant noon = Time.parseInstant("20200101-1200Z");
+        Assert.assertEquals(Time.makeIso8601DateStringZ(noon), 
"2020-01-01T12:00:00.000Z");
+    }
+
 }

Reply via email to