From 7271fbe960a5333f4a0190d086516934b78c77df Mon Sep 17 00:00:00 2001
From: Amir Golparvar <amir.golparvar@physik.hu-berlin.de>
Date: Wed, 8 Jun 2022 14:45:03 +0000
Subject: [PATCH] Resolve "Datetime parsing issues"

---
 nomad/metainfo/metainfo.py             |  5 ++++-
 tests/metainfo/test_quantities.py      | 13 +++++++++++--
 tests/processing/test_edit_metadata.py |  6 +++---
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py
index f0c0383aa6..1f1db98788 100644
--- a/nomad/metainfo/metainfo.py
+++ b/nomad/metainfo/metainfo.py
@@ -29,7 +29,7 @@ import pint
 import pint.unit
 import pint.quantity
 import aniso8601
-from datetime import datetime
+from datetime import datetime, date
 import pytz
 import docstring_parser
 import jmespath
@@ -835,6 +835,9 @@ class _Datetime(DataType):
         elif isinstance(value, pint.Quantity):
             value = datetime.fromtimestamp(value.magnitude)
 
+        elif not isinstance(value, datetime) and isinstance(value, date):
+            value = datetime.combine(value, datetime.min.time())
+
         if not isinstance(value, datetime):
             raise TypeError('%s is not a datetime.' % value)
 
diff --git a/tests/metainfo/test_quantities.py b/tests/metainfo/test_quantities.py
index 931536f10a..bede3bb904 100644
--- a/tests/metainfo/test_quantities.py
+++ b/tests/metainfo/test_quantities.py
@@ -35,6 +35,7 @@ from nomad.metainfo import MSection, Quantity, Unit, units, JSON, Dimension, Dat
     pytest.param(Dimension, 'quantity', id='Dimension-quantity'),
     pytest.param(Datetime, datetime.datetime.now(datetime.timezone.utc), id='Datetime'),
     pytest.param(Datetime, datetime.datetime.now(pytz.timezone('America/Los_Angeles')), id='Datetime'),
+    pytest.param(Datetime, datetime.date.today(), id='Date'),
     pytest.param(Capitalized, 'Hello', id='Capitalize'),
     pytest.param(Bytes, b'hello', id='Bytes')
 ])
@@ -45,12 +46,20 @@ def test_basic_types(def_type, value):
     section = TestSectionA()
     assert section.quantity is None
     section.quantity = value
+    if not isinstance(value, datetime.datetime) and isinstance(value, datetime.date):
+        assert section.quantity == datetime.datetime.combine(value, datetime.datetime.min.time()).replace(
+            tzinfo=pytz.utc)
+    else:
+        assert section.quantity == value
 
-    assert section.quantity == value
     section_serialized = section.m_to_dict()
     json.dumps(section_serialized)
     section = TestSectionA.m_from_dict(section_serialized)
-    assert section.quantity == value
+    if not isinstance(value, datetime.datetime) and isinstance(value, datetime.date):
+        assert section.quantity == datetime.datetime.combine(value, datetime.datetime.min.time()).replace(
+            tzinfo=pytz.utc)
+    else:
+        assert section.quantity == value
 
     class TestSectionB(MSection):
         quantity = Quantity(type=def_type, default=value)
diff --git a/tests/processing/test_edit_metadata.py b/tests/processing/test_edit_metadata.py
index afadeaf352..011e5257b3 100644
--- a/tests/processing/test_edit_metadata.py
+++ b/tests/processing/test_edit_metadata.py
@@ -46,9 +46,9 @@ all_coauthor_entry_metadata = {
 
 all_admin_metadata = dict(
     # Every attribute which only admins can set
-    upload_create_time='2021-05-04T11:00:00',
-    entry_create_time='2021-05-04T11:00:00',
-    publish_time='2021-05-04T11:00:00',
+    upload_create_time='2021-05-04T00:00:00',
+    entry_create_time='2021-05-04T00:00:00',
+    publish_time='2021-05-04T00:00:00',
     license='a license',
     main_author='lhofstadter')
 
-- 
GitLab