diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/BaseDateTimeType.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/BaseDateTimeType.java index c59da9c5c..fca5cdd0c 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/BaseDateTimeType.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/BaseDateTimeType.java @@ -38,6 +38,7 @@ import org.apache.commons.lang3.time.DateUtils; import org.hl7.fhir.utilities.DateTimeUtil; import org.hl7.fhir.utilities.Utilities; +import javax.annotation.Nullable; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; @@ -169,10 +170,19 @@ public abstract class BaseDateTimeType extends PrimitiveType { myTimeZoneZulu = false; } + public String getValueAsString(TemporalPrecisionEnum thePrecision) { + return encode(getValue(), thePrecision); + } + @Override protected String encode(Date theValue) { - if (theValue == null) { - return null; + return encode(theValue, myPrecision); + } + + @Nullable + private String encode(Date theValue, TemporalPrecisionEnum thePrecision) { + if (theValue == null) { + return null; } else { GregorianCalendar cal; if (myTimeZoneZulu) { @@ -186,21 +196,22 @@ public abstract class BaseDateTimeType extends PrimitiveType { StringBuilder b = new StringBuilder(); leftPadWithZeros(cal.get(Calendar.YEAR), 4, b); - if (myPrecision.ordinal() > TemporalPrecisionEnum.YEAR.ordinal()) { + + if (thePrecision.ordinal() > TemporalPrecisionEnum.YEAR.ordinal()) { b.append('-'); leftPadWithZeros(cal.get(Calendar.MONTH) + 1, 2, b); - if (myPrecision.ordinal() > TemporalPrecisionEnum.MONTH.ordinal()) { + if (thePrecision.ordinal() > TemporalPrecisionEnum.MONTH.ordinal()) { b.append('-'); leftPadWithZeros(cal.get(Calendar.DATE), 2, b); - if (myPrecision.ordinal() > TemporalPrecisionEnum.DAY.ordinal()) { + if (thePrecision.ordinal() > TemporalPrecisionEnum.DAY.ordinal()) { b.append('T'); leftPadWithZeros(cal.get(Calendar.HOUR_OF_DAY), 2, b); b.append(':'); leftPadWithZeros(cal.get(Calendar.MINUTE), 2, b); - if (myPrecision.ordinal() > TemporalPrecisionEnum.MINUTE.ordinal()) { + if (thePrecision.ordinal() > TemporalPrecisionEnum.MINUTE.ordinal()) { b.append(':'); leftPadWithZeros(cal.get(Calendar.SECOND), 2, b); - if (myPrecision.ordinal() > TemporalPrecisionEnum.SECOND.ordinal()) { + if (thePrecision.ordinal() > TemporalPrecisionEnum.SECOND.ordinal()) { b.append('.'); b.append(myFractionalSeconds); for (int i = myFractionalSeconds.length(); i < 3; i++) { @@ -230,11 +241,11 @@ public abstract class BaseDateTimeType extends PrimitiveType { } } } - return b.toString(); + return b.toString(); } - } + } - /** + /** * Returns the month with 1-index, e.g. 1=the first day of the month */ public Integer getDay() { diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/model/BaseDateTimeTypeTest.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/model/BaseDateTimeTypeTest.java index 3ea29c35a..70a6933a0 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/model/BaseDateTimeTypeTest.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/model/BaseDateTimeTypeTest.java @@ -1,5 +1,6 @@ package org.hl7.fhir.r5.model; +import ca.uhn.fhir.model.api.TemporalPrecisionEnum; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -158,4 +159,22 @@ public class BaseDateTimeTypeTest { assertEquals(param, srcInstance.getValueAsString()); } + private static Stream getGetValueAsStringParams() { + + return Stream.of( + Arguments.of(new DateTimeType("1933-01-02T12:34:56.789"), TemporalPrecisionEnum.MILLI, "1933-01-02T12:34:56.789"), + Arguments.of(new DateTimeType("1933-01-02T12:34:56.789"), TemporalPrecisionEnum.SECOND, "1933-01-02T12:34:56"), + Arguments.of(new DateTimeType("1933-01-02T12:34:56.789"), TemporalPrecisionEnum.MINUTE, "1933-01-02T12:34"), + Arguments.of(new DateTimeType("1933-01-02T12:34:56.789"), TemporalPrecisionEnum.MINUTE, "1933-01-02T12:34"), + Arguments.of(new DateTimeType("1933-01-02T12:34:56.789"), TemporalPrecisionEnum.DAY, "1933-01-02"), + Arguments.of(new DateTimeType("1933-01-02T12:34:56.789"), TemporalPrecisionEnum.MONTH, "1933-01"), + Arguments.of(new DateTimeType("1933-01-02T12:34:56.789"), TemporalPrecisionEnum.YEAR, "1933") + ); + } + + @ParameterizedTest + @MethodSource("getGetValueAsStringParams") + public void testGetValueAsString(DateTimeType theType, TemporalPrecisionEnum thePrecision, String expectedStringValue) { + assertEquals(expectedStringValue, theType.getValueAsString(thePrecision)); + } } \ No newline at end of file