diff --git a/src/main/java/org/caosdb/datetime/DateTimeFactory2.java b/src/main/java/org/caosdb/datetime/DateTimeFactory2.java
index 103359c7b4ff6f995996866e2283bab47562699c..14088ea5d1033771d8835352b61e5bf430c4ff5f 100644
--- a/src/main/java/org/caosdb/datetime/DateTimeFactory2.java
+++ b/src/main/java/org/caosdb/datetime/DateTimeFactory2.java
@@ -30,6 +30,11 @@ import org.antlr.v4.runtime.CommonTokenStream;
 import org.caosdb.server.query.CQLParsingErrorListener;
 import org.caosdb.server.query.CQLParsingErrorListener.ParsingError;
 
+/**
+ * Factory which parses string into CaosDB's DATETIME values.
+ *
+ * @author tf
+ */
 public class DateTimeFactory2 implements DateTimeFactoryInterface {
 
   private Long millis = null;
@@ -51,6 +56,14 @@ public class DateTimeFactory2 implements DateTimeFactoryInterface {
   private Integer nanosecond = null;
   private TimeZone timeZone = TimeZone.getDefault();
 
+  public DateTimeFactory2(TimeZone timeZone) {
+    this.timeZone = timeZone;
+  }
+
+  public DateTimeFactory2() {
+    this(TimeZone.getDefault());
+  }
+
   @Override
   public void setDate(final String string) {
     this.date = Integer.valueOf(string);
@@ -220,6 +233,16 @@ public class DateTimeFactory2 implements DateTimeFactoryInterface {
   }
 
   public static DateTimeInterface valueOf(final String str) {
+    return valueOf(str, TimeZone.getDefault());
+  }
+
+  public static DateTimeInterface valueOf(final String str, TimeZone timeZone) {
+    final DateTimeFactory2 dtf = new DateTimeFactory2(timeZone);
+
+    return dtf.parse(str);
+  }
+
+  public DateTimeInterface parse(String str) {
     final DateTimeLexer lexer = new DateTimeLexer(CharStreams.fromString(str));
     final CommonTokenStream tokens = new CommonTokenStream(lexer);
 
@@ -230,9 +253,7 @@ public class DateTimeFactory2 implements DateTimeFactoryInterface {
     final CQLParsingErrorListener el = new CQLParsingErrorListener(DateTimeLexer.UNKNOWN_CHAR);
     parser.addErrorListener(el);
 
-    final DateTimeFactory2 dtf = new DateTimeFactory2();
-
-    parser.datetime(dtf);
+    parser.datetime(this);
 
     if (el.hasErrors()) {
       final StringBuilder sb = new StringBuilder();
@@ -243,7 +264,7 @@ public class DateTimeFactory2 implements DateTimeFactoryInterface {
           "Parsing DateTime finished with errors. \n" + sb.toString());
     }
 
-    return dtf.getDateTime();
+    return getDateTime();
   }
 
   @Override
diff --git a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
index 913f677f20124a602fed834ba7738941c928e89e..168b90d81e2643e7742360a79b25eb5767cf618f 100644
--- a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
+++ b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java
@@ -24,6 +24,7 @@ package org.caosdb.server.grpc;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.TimeZone;
 import org.caosdb.api.entity.v1.AtomicDataType;
 import org.caosdb.api.entity.v1.CollectionValues;
 import org.caosdb.api.entity.v1.DataType;
@@ -72,6 +73,12 @@ import org.caosdb.server.permissions.EntityPermission;
 
 public class CaosDBToGrpcConverters {
 
+  private TimeZone timeZone;
+
+  public CaosDBToGrpcConverters(TimeZone timeZone) {
+    this.timeZone = timeZone;
+  }
+
   /** Get the unit as string. */
   public String getStringUnit(final EntityInterface entity) {
     final Iterator<Property> iterator = entity.getProperties().iterator();
@@ -236,7 +243,7 @@ public class CaosDBToGrpcConverters {
     return builder;
   }
 
-  private ScalarValue.Builder convertScalarValue(final Value value) {
+  protected ScalarValue.Builder convertScalarValue(final Value value) {
 
     if (value instanceof BooleanValue) {
       return convertBooleanValue((BooleanValue) value);
@@ -260,20 +267,20 @@ public class CaosDBToGrpcConverters {
     } else if (wrappedValue instanceof Integer) {
       return ScalarValue.newBuilder().setIntegerValue((Integer) wrappedValue);
     } else {
-      return convertStringValue(value);
+      return convertStringValue(value.toString());
     }
   }
 
-  private org.caosdb.api.entity.v1.ScalarValue.Builder convertStringValue(final Value value) {
-    if (value.toString().isEmpty()) {
+  private org.caosdb.api.entity.v1.ScalarValue.Builder convertStringValue(final String value) {
+    if (value.isEmpty()) {
       return ScalarValue.newBuilder().setSpecialValue(SpecialValue.SPECIAL_VALUE_EMPTY_STRING);
     }
-    return ScalarValue.newBuilder().setStringValue(value.toString());
+    return ScalarValue.newBuilder().setStringValue(value);
   }
 
   private org.caosdb.api.entity.v1.ScalarValue.Builder convertDateTimeInterface(
       final DateTimeInterface value) {
-    return convertStringValue(value);
+    return convertStringValue(value.toDateTimeString(timeZone));
   }
 
   private org.caosdb.api.entity.v1.ScalarValue.Builder convertBooleanValue(
@@ -282,7 +289,7 @@ public class CaosDBToGrpcConverters {
   }
 
   private ScalarValue.Builder convertReferenceValue(final ReferenceValue value) {
-    return convertStringValue(value);
+    return convertStringValue(value.toString());
   }
 
   private org.caosdb.api.entity.v1.Value.Builder convertCollectionValue(
diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
index 8abb284782dad53a8a0c5701f653ad466dee0ece..c234e61048ba7af730dd7928d0b64ff587c005cc 100644
--- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
+++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java
@@ -23,6 +23,7 @@ package org.caosdb.server.grpc;
 
 import io.grpc.stub.StreamObserver;
 import java.util.HashMap;
+import java.util.TimeZone;
 import java.util.UUID;
 import org.apache.shiro.SecurityUtils;
 import org.caosdb.api.entity.v1.DeleteRequest;
@@ -63,7 +64,9 @@ import org.caosdb.server.utils.ServerMessages;
 
 public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBase {
 
-  private final CaosDBToGrpcConverters caosdbToGrpc = new CaosDBToGrpcConverters();
+  // TODO(tf) let the clients define the time zone of the date time values which are being returned.
+  private final CaosDBToGrpcConverters caosdbToGrpc =
+      new CaosDBToGrpcConverters(TimeZone.getDefault());
   private final GrpcToCaosDBConverters grpcToCaosdb = new GrpcToCaosDBConverters();
   private final FileTransmissionServiceImpl fileTransmissionService;
 
diff --git a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..445ec01880b3468b7800ed332a45824f561b7a9c
--- /dev/null
+++ b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
@@ -0,0 +1,43 @@
+package org.caosdb.server.grpc;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.TimeZone;
+import org.caosdb.datetime.DateTimeFactory2;
+import org.caosdb.server.datatype.Value;
+import org.junit.Test;
+
+public class CaosDBToGrpcConvertersTest {
+
+  @Test
+  public void testConvertScalarValue_Datetime() {
+    TimeZone timeZone = TimeZone.getTimeZone("UTC");
+    DateTimeFactory2 factory = new DateTimeFactory2(timeZone);
+    CaosDBToGrpcConverters converters = new CaosDBToGrpcConverters(timeZone);
+    Value value = null;
+    assertNull(converters.convertScalarValue(value));
+    value = factory.parse("2022");
+    assertEquals(converters.convertScalarValue(value).toString(), "string_value: \"2022\"\n");
+    value = factory.parse("2022-12");
+    assertEquals(converters.convertScalarValue(value).toString(), "string_value: \"2022-12\"\n");
+    value = factory.parse("2022-12-24");
+    assertEquals(converters.convertScalarValue(value).toString(), "string_value: \"2022-12-24\"\n");
+    value = factory.parse("2022-12-24T18:15:00");
+    assertEquals(
+        converters.convertScalarValue(value).toString(),
+        "string_value: \"2022-12-24T18:15:00+0000\"\n");
+    value = factory.parse("2022-12-24T18:15:00.999999");
+    assertEquals(
+        converters.convertScalarValue(value).toString(),
+        "string_value: \"2022-12-24T18:15:00.999999+0000\"\n");
+    value = factory.parse("2022-12-24T18:15:00.999999UTC");
+    assertEquals(
+        converters.convertScalarValue(value).toString(),
+        "string_value: \"2022-12-24T18:15:00.999999+0000\"\n");
+    value = factory.parse("2022-12-24T18:15:00.999999+0200");
+    assertEquals(
+        converters.convertScalarValue(value).toString(),
+        "string_value: \"2022-12-24T16:15:00.999999+0000\"\n");
+  }
+}