diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/DateTimeUtils.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/DateTimeUtils.java index b33a51435f2..4507180a4f7 100644 --- a/jena-base/src/main/java/org/apache/jena/atlas/lib/DateTimeUtils.java +++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/DateTimeUtils.java @@ -18,6 +18,8 @@ package org.apache.jena.atlas.lib; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.Calendar ; import java.util.Date ; import java.util.GregorianCalendar ; @@ -25,22 +27,13 @@ import org.apache.commons.lang3.time.FastDateFormat ; public class DateTimeUtils { - - // Include timezone (even xsd:dates have timezones; Calendars have timezones) - // NB in SimpleDateFormat != FastDateFormat - // SimpleDateFormat does not format Calendars. - // SimpleDateFormat has "X" for ISO format tmezones (+00:00) - // FastDateFormat uses "ZZ" for this. - private static final FastDateFormat dateTimeFmt_display = FastDateFormat.getInstance("yyyy/MM/dd HH:mm:ss z") ; - private static final FastDateFormat dateFmt_yyyymmdd = FastDateFormat.getInstance("yyyy-MM-ddZZ") ; - // For milliseconds == 0 - private static final FastDateFormat dateTimeFmt_XSD_ms0 = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZZ") ; - // For milliseconds != 0 - private static final FastDateFormat dateTimeFmt_XSD_ms = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSSZZ") ; - // For milliseconds == 0 - private static final FastDateFormat timeFmt_XSD_ms0 = FastDateFormat.getInstance("HH:mm:ssZZ") ; - // For milliseconds != 0 - private static final FastDateFormat timeFmt_XSD_ms = FastDateFormat.getInstance("HH:mm:ss.SSSZZ") ; + // Use xxx to get +00:00 format with DateTimeFormatter + private static final DateTimeFormatter dateTimeFmt_display = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss zz"); + private static final DateTimeFormatter dateFmt_yyyymmdd = DateTimeFormatter.ofPattern("yyyy-MM-ddxxx"); + private static final DateTimeFormatter dateTimeFmt_XSD_ms0 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx"); + private static final DateTimeFormatter dateTimeFmt_XSD_ms = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx"); + private static final DateTimeFormatter timeFmt_XSD_ms0 = DateTimeFormatter.ofPattern("HH:mm:ssxxx"); + private static final DateTimeFormatter timeFmt_XSD_ms = DateTimeFormatter.ofPattern("HH:mm:ss.SSSxxx"); public static String nowAsXSDDateTimeString() { return calendarToXSDDateTimeString(new GregorianCalendar()) ; @@ -60,68 +53,42 @@ public static String nowAsString(String formatString) { return df.format(new Date()) ; } - public static String nowAsString(FastDateFormat dateFormat) { - return dateFormat.format(new Date()) ; + public static String nowAsString(DateTimeFormatter dateFormat) { + ZonedDateTime now = ZonedDateTime.now(); + return dateFormat.format(now); } private static boolean hasZeroMilliSeconds(Calendar cal) { return ! cal.isSet(Calendar.MILLISECOND) || cal.get(Calendar.MILLISECOND) == 0 ; } - // Canonical fom : if ms == 0, don't include in the string. + // Canonical form : if ms == 0, don't include in the string. public static String calendarToXSDDateTimeString(Calendar cal) { - FastDateFormat fmt = hasZeroMilliSeconds(cal) - ? dateTimeFmt_XSD_ms0 - : dateTimeFmt_XSD_ms ; + DateTimeFormatter fmt = hasZeroMilliSeconds(cal) + ? dateTimeFmt_XSD_ms0 + : dateTimeFmt_XSD_ms ; return calendarToXSDString(cal, fmt) ; } public static String calendarToXSDDateString(Calendar cal) { - return calendarToXSDString(cal, dateFmt_yyyymmdd) ; + String x = calendarToXSDString(cal, dateFmt_yyyymmdd) ; + if ( x.endsWith("Z") ) + x = x.substring(0, x.length()-1)+"+00:00"; + return x; } // Canonical fom : if ms == 0, don't include in the string. public static String calendarToXSDTimeString(Calendar cal) { - FastDateFormat fmt = hasZeroMilliSeconds(cal) - ? timeFmt_XSD_ms0 - : timeFmt_XSD_ms ; + DateTimeFormatter fmt = hasZeroMilliSeconds(cal) + ? timeFmt_XSD_ms0 + : timeFmt_XSD_ms ; return calendarToXSDString(cal, fmt) ; } - private static String calendarToXSDString(Calendar cal, FastDateFormat fmt) { - String lex = fmt.format(cal) ; + private static String calendarToXSDString(Calendar cal, DateTimeFormatter fmt) { + ZonedDateTime zdt = ((GregorianCalendar)cal).toZonedDateTime(); + String lex = fmt.format(zdt) ; // lex = lex + calcTimezone(cal) ; return lex ; } - - // Not needed because of FastDateFormat -// private static String calcTimezone(Calendar cal) { -// Date date = cal.getTime() ; -// TimeZone z = cal.getTimeZone() ; -// int tz = z.getRawOffset() ; -// -// if ( z.inDaylightTime(date) ) { -// int tzDst = z.getDSTSavings() ; -// tz = tz + tzDst ; -// } -// -// String sign = "+" ; -// if ( tz < 0 ) { -// sign = "-" ; -// tz = -tz ; -// } -// -// int tzH = tz / (60 * 60 * 1000) ; // Integer divide towards zero. -// int tzM = (tz - tzH * 60 * 60 * 1000) / (60 * 1000) ; -// -// String tzH_str = Integer.toString(tzH) ; -// String tzM_str = Integer.toString(tzM) ; -// -// if ( tzH < 10 ) -// tzH_str = "0" + tzH_str ; -// if ( tzM < 10 ) -// tzM_str = "0" + tzM_str ; -// return sign + tzH_str + ":" + tzM_str ; -// } } - diff --git a/pom.xml b/pom.xml index d910258f766..92ce440ead1 100644 --- a/pom.xml +++ b/pom.xml @@ -66,20 +66,20 @@ POM for the correct dependency versions and use that or later. --> - 0.12.3 + 0.12.5 2.9.9 2.9.9.3 2.6 1.4 - 3.4 - 1.5 + 3.9 + 1.7 1.13 1.19 0.7 - 4.5.5 + 4.5.10 4.4.9 @@ -933,7 +933,7 @@ org.apache.maven.shared maven-filtering - 1.2 + 3.1.1