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"); + } + }
