From 3f4eb514053dea5799a1bf5cef61bdde18cf8356 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20M=C3=BCller?= <mueller.seb@posteo.de>
Date: Mon, 24 Mar 2025 16:17:16 +0100
Subject: [PATCH 1/3] mo_datetime: better conversion from string; allow 'T' as
 separator; allow missing entries (e.g. no second given)

---
 src/mo_datetime.f90              | 24 +++++++++++++++++-------
 src/pf_tests/test_mo_datetime.pf |  9 +++++++++
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/src/mo_datetime.f90 b/src/mo_datetime.f90
index 94bb1d3..77224fd 100644
--- a/src/mo_datetime.f90
+++ b/src/mo_datetime.f90
@@ -605,7 +605,11 @@ contains
     type(puredate) :: in_date
     type(puretime) :: in_time
     character(256), dimension(:), allocatable :: str_arr
-    call divide_string(trim(string), ' ', str_arr)
+    if ( index(string, "T") > 0 ) then
+      call divide_string(trim(string), 'T', str_arr)
+    else
+      call divide_string(trim(string), ' ', str_arr)
+    end if
     in_date = d_from_string(str_arr(1))
     in_time = midnight()
     if(size(str_arr) > 1_i4) in_time = t_from_string(str_arr(2))
@@ -995,9 +999,12 @@ contains
     character(256), dimension(:), allocatable :: date_str
     integer(i4) :: year, month, day
     call divide_string(trim(string), '-', date_str)
-    read(date_str(1), *) year
-    read(date_str(2), *) month
-    read(date_str(3), *) day
+    year = 1_i4
+    month = 1_i4
+    day = 1_i4
+    if (len_trim(date_str(1)) > 0) read(date_str(1), *) year
+    if (size(date_str) > 1) read(date_str(2), *) month
+    if (size(date_str) > 2) read(date_str(3), *) day
     d_from_string = d_init(year=year, month=month, day=day)
   end function d_from_string
 
@@ -1275,9 +1282,12 @@ contains
     character(256), dimension(:), allocatable :: time_str
     integer(i4) :: hour, minute, second
     call divide_string(trim(string), ':', time_str)
-    read(time_str(1), *) hour
-    read(time_str(2), *) minute
-    read(time_str(3), *) second
+    hour = 0_i4
+    minute = 0_i4
+    second = 0_i4
+    if (len_trim(time_str(1)) > 0) read(time_str(1), *) hour
+    if (size(time_str) > 1) read(time_str(2), *) minute
+    if (size(time_str) > 2) read(time_str(3), *) second
     t_from_string = t_init(hour=hour, minute=minute, second=second)
   end function t_from_string
 
diff --git a/src/pf_tests/test_mo_datetime.pf b/src/pf_tests/test_mo_datetime.pf
index 18ecbe8..a3276a5 100644
--- a/src/pf_tests/test_mo_datetime.pf
+++ b/src/pf_tests/test_mo_datetime.pf
@@ -247,6 +247,15 @@ contains
     ! date with time has higher julian day fraction
     @assertTrue(julian >= julian2)
 
+    ! partial datetime init from string
+    @assertTrue(datetime("1992-10-8 15:15:42") == datetime("1992-10-08T15:15:42"))
+    @assertTrue(datetime("1992-10-08 15:15:00") == datetime("1992-10-08 15:15"))
+    @assertTrue(datetime("1992-10-08 15:00:00") == datetime("1992-10-08 15"))
+    @assertTrue(datetime("1992-10-08T00:00:00") == datetime("1992-10-08"))
+    @assertTrue(datetime("1992-10-08T00:00:00") == datetime("1992-10-08"))
+    @assertTrue(datetime("1992-10-01 15:15:00") == datetime("1992-10T15:15"))
+    @assertTrue(datetime("1992-01-01 15:15:00") == datetime("1992 15:15"))
+
   end subroutine test_datetime_types
 
 end module test_mo_datetime
-- 
GitLab


From 7031ff7b4f95990036ad60337bbfabb2f14094ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20M=C3=BCller?= <mueller.seb@posteo.de>
Date: Mon, 24 Mar 2025 16:28:07 +0100
Subject: [PATCH 2/3] datetime: fix doc-string example

---
 src/mo_datetime.f90 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/mo_datetime.f90 b/src/mo_datetime.f90
index 77224fd..f74a55c 100644
--- a/src/mo_datetime.f90
+++ b/src/mo_datetime.f90
@@ -43,8 +43,8 @@
 !!
 !!            ! create from datetime string
 !!            date5 = datetime('2023-05-08 12:32:30')
-!!            day1 = date('2023-05-08')
-!!            time1 = time('12:32:30')
+!!            day1 = puredate('2023-05-08')
+!!            time1 = puretime('12:32:30')
 !!            print*, date5 == time1%with_date(day1)
 !!            print*, date5 == day1%with_time(time1)
 !!            print*, date5 == datetime(day1, time1)
-- 
GitLab


From 1ef90d13d3a7663d134a5a55ab8efebd003bb1b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20M=C3=BCller?= <mueller.seb@posteo.de>
Date: Fri, 28 Mar 2025 12:31:59 +0100
Subject: [PATCH 3/3] finalize test

---
 src/pf_tests/test_mo_datetime.pf | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/pf_tests/test_mo_datetime.pf b/src/pf_tests/test_mo_datetime.pf
index a3276a5..b82b7fd 100644
--- a/src/pf_tests/test_mo_datetime.pf
+++ b/src/pf_tests/test_mo_datetime.pf
@@ -252,7 +252,8 @@ contains
     @assertTrue(datetime("1992-10-08 15:15:00") == datetime("1992-10-08 15:15"))
     @assertTrue(datetime("1992-10-08 15:00:00") == datetime("1992-10-08 15"))
     @assertTrue(datetime("1992-10-08T00:00:00") == datetime("1992-10-08"))
-    @assertTrue(datetime("1992-10-08T00:00:00") == datetime("1992-10-08"))
+    @assertTrue(datetime("1992-10-01T00:00:00") == datetime("1992-10"))
+    @assertTrue(datetime("1992-01-01T00:00:00") == datetime("1992"))
     @assertTrue(datetime("1992-10-01 15:15:00") == datetime("1992-10T15:15"))
     @assertTrue(datetime("1992-01-01 15:15:00") == datetime("1992 15:15"))
 
-- 
GitLab