diff --git a/src/stream_gribapi.c b/src/stream_gribapi.c
index 63799c6712f4b492bd16c70256bdcf9cd55b19e8..d5ccc881f9846556cd963eef2ec85452929e354d 100644
--- a/src/stream_gribapi.c
+++ b/src/stream_gribapi.c
@@ -173,11 +173,10 @@ gribapiGetTimeUnitFactor(const int timeUnits)
   return 0;
 }
 
-static void
-gribapiGetValidityDateTime(grib_handle *gh, int *vDate, int *vTime, int *sDate, int *sTime)
+static CmpDateTime
+gribapiGetValidityDateTime(grib_handle *gh, CmpDateTime *cmpDateTimeS)
 {
-  *sDate = 0;
-  *sTime = 0;
+  int vdate = 0, sdate = 0, vtime = 0, stime = 0;
 
   long sigofrtime = 3;
   if (gribEditionNumber(gh) > 1)
@@ -189,9 +188,9 @@ gribapiGetValidityDateTime(grib_handle *gh, int *vDate, int *vTime, int *sDate,
       == 3)  // XXX: This looks like a bug to me, because timeRangeIndicator == 3 does not seem to have the same meaning as
              // significanceOfReferenceTime == 3. I would recommend replacing this condition with `if(!gribapiTimeIsFC())`.
     {
-      CdiDateTime vDateTime = gribapiGetDataDateTime(gh);
-      *vDate = (int) cdiDate_get(vDateTime.date);
-      *vTime = cdiTime_get(vDateTime.time);
+      const CdiDateTime vDateTime = gribapiGetDataDateTime(gh);
+      vdate = (int) cdiDate_get(vDateTime.date);
+      vtime = cdiTime_get(vDateTime.time);
     }
   else
     {
@@ -210,20 +209,28 @@ gribapiGetValidityDateTime(grib_handle *gh, int *vDate, int *vTime, int *sDate,
 
           // if (startStep > 0)
           {
-            JulianDate julianDate2 = julianDate_add_seconds(julianDate, timeUnitFactor * startStep);
+            const JulianDate julianDate2 = julianDate_add_seconds(julianDate, timeUnitFactor * startStep);
             CdiDateTime sDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate2);
             sDateTime.time.second = 0;
-            *sDate = (int) cdiDate_get(sDateTime.date);
-            *sTime = cdiTime_get(sDateTime.time);
+            sdate = (int) cdiDate_get(sDateTime.date);
+            stime = cdiTime_get(sDateTime.time);
           }
 
           julianDate = julianDate_add_seconds(julianDate, timeUnitFactor * endStep);
           rDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate);
         }
 
-      *vDate = (int) cdiDate_get(rDateTime.date);
-      *vTime = cdiTime_get(rDateTime.time);
+      vdate = (int) cdiDate_get(rDateTime.date);
+      vtime = cdiTime_get(rDateTime.time);
     }
+
+  cmpDateTimeS->date = sdate;
+  cmpDateTimeS->time = stime;
+
+  CmpDateTime cmpDateTimeV;
+  cmpDateTimeV.date = vdate;
+  cmpDateTimeV.time = vtime;
+  return cmpDateTimeV;
 }
 
 static void
@@ -1067,23 +1074,22 @@ fdbScanTimesteps(stream_t *streamptr)
 
       const int param = gribapiGetParam(gh);
 
-      int vDate, vTime, sDate, sTime;
-      gribapiGetValidityDateTime(gh, &vDate, &vTime, &sDate, &sTime);
-      CmpDateTime datetime = { .date = vDate, .time = vTime };
+      CmpDateTime cdtS;
+      const CmpDateTime cdtV = gribapiGetValidityDateTime(gh, &cdtS);
 
       VarScanKeys scanKeys = gribapiGetScanKeys(gh);
 
       if (recID == 0)
         {
-          datetime0 = datetime;
+          datetime0 = cdtV;
           taxis->rdatetime = gribapiGetDataDateTime(gh);
           fcast = gribapiTimeIsFC(gh);
           if (fcast) taxis->unit = gribapiGetTimeUnits(gh);
           taxis->fdate = (int) cdiDate_get(taxis->rdatetime.date);
           taxis->ftime = cdiTime_get(taxis->rdatetime.time);
-          taxis->sdate = sDate;
-          taxis->stime = sTime;
-          taxis->vdatetime = cdiDateTime_set(vDate, vTime);
+          taxis->sdate = cdtS.date;
+          taxis->stime = cdtS.time;
+          taxis->vdatetime = cdiDateTime_set(cdtV.date, cdtV.time);
         }
 
       if (CDI_Debug)
@@ -1091,7 +1097,7 @@ fdbScanTimesteps(stream_t *streamptr)
           char paramstr[32];
           cdiParamToString(param, paramstr, sizeof(paramstr));
           Message("%4d name=%s id=%s ltype=%d lev1=%d lev2=%d vdate=%lld vtime=%d", recID + 1, varname, paramstr, leveltype1,
-                  level1, level2, vDate, vTime);
+                  level1, level2, cdtV.date, cdtV.time);
         }
 
       var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL;
@@ -1232,36 +1238,35 @@ gribapiScanTimestep1(stream_t *streamptr)
 
       if (!varname[0]) param_to_name(param, varname);
 
-      int vDate, vTime, sDate, sTime;
-      gribapiGetValidityDateTime(gh, &vDate, &vTime, &sDate, &sTime);
-      CmpDateTime datetime = { .date = vDate, .time = vTime };
+      CmpDateTime cdtS;
+      const CmpDateTime cdtV = gribapiGetValidityDateTime(gh, &cdtS);
 
       VarScanKeys scanKeys = gribapiGetScanKeys(gh);
 
       if (nrecs == 0)
         {
-          datetime0 = datetime;
+          datetime0 = cdtV;
           taxis->rdatetime = gribapiGetDataDateTime(gh);
           fcast = gribapiTimeIsFC(gh);
           if (fcast) taxis->unit = gribapiGetTimeUnits(gh);
           taxis->fdate = (int) cdiDate_get(taxis->rdatetime.date);
           taxis->ftime = cdiTime_get(taxis->rdatetime.time);
-          taxis->sdate = sDate;
-          taxis->stime = sTime;
-          taxis->vdatetime = cdiDateTime_set(vDate, vTime);
+          taxis->sdate = cdtS.date;
+          taxis->stime = cdtS.time;
+          taxis->vdatetime = cdiDateTime_set(cdtV.date, cdtV.time);
         }
       else
         {
-          if (sDate < taxis->sdate || (sDate == taxis->sdate && sTime < taxis->stime))
+          if (cdtS.date < taxis->sdate || (cdtS.date == taxis->sdate && cdtS.time < taxis->stime))
             {
-              taxis->sdate = sDate;
-              taxis->stime = sTime;
+              taxis->sdate = cdtS.date;
+              taxis->stime = cdtS.time;
             }
 
           const int tsteptype = gribapiGetTsteptype(gh);
           const size_t gridsize = gribapiGetGridsize(gh);
           checkTimeResult result = checkTime(
-              streamptr, gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles), &datetime,
+              streamptr, gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles), &cdtV,
               &datetime0);
           if (result == CHECKTIME_STOP)
             {
@@ -1288,7 +1293,7 @@ gribapiScanTimestep1(stream_t *streamptr)
           char paramstr[32];
           cdiParamToString(param, paramstr, sizeof(paramstr));
           Message("%4u %8d name=%s id=%s ltype=%d lev1=%d lev2=%d vdate=%lld vtime=%d", nrecs, (int) recpos, varname, paramstr,
-                  leveltype1, level1, level2, vDate, vTime);
+                  leveltype1, level1, level2, cdtV.date, cdtV.time);
         }
 
       var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL;
@@ -1399,13 +1404,12 @@ gribapiScanTimestep2(stream_t *streamptr)
 
       if (!varname[0]) param_to_name(param, varname);
 
-      int vDate, vTime, sDate, sTime;
-      gribapiGetValidityDateTime(gh, &vDate, &vTime, &sDate, &sTime);
-      CmpDateTime datetime = { .date = vDate, .time = vTime };
+      CmpDateTime cdtS;
+      const CmpDateTime cdtV = gribapiGetValidityDateTime(gh, &cdtS);
 
       if (rindex == 0)
         {
-          datetime0 = datetime;
+          datetime0 = cdtV;
           const int taxisID = vlistInqTaxis(vlistID);
           if (taxisInqType(taxisID) == TAXIS_RELATIVE)
             {
@@ -1419,18 +1423,18 @@ gribapiScanTimestep2(stream_t *streamptr)
             }
           taxis->fdate = (int) cdiDate_get(taxis->rdatetime.date);
           taxis->ftime = cdiTime_get(taxis->rdatetime.time);
-          taxis->vdatetime = cdiDateTime_set(vDate, vTime);
-          taxis->sdate = sDate;
-          taxis->stime = sTime;
+          taxis->vdatetime = cdiDateTime_set(cdtV.date, cdtV.time);
+          taxis->sdate = cdtS.date;
+          taxis->stime = cdtS.time;
           // printf("2: %d %6d  %d %6d  %d %6d\n", taxis->rdate, taxis->rtime, taxis->sdate, taxis->stime, taxis->vdate,
           // taxis->vtime);
         }
       else
         {
-          if (sDate < taxis->sdate || (sDate == taxis->sdate && sTime < taxis->stime))
+          if (cdtS.date < taxis->sdate || (cdtS.date == taxis->sdate && cdtS.time < taxis->stime))
             {
-              taxis->sdate = sDate;
-              taxis->stime = sTime;
+              taxis->sdate = cdtS.date;
+              taxis->stime = cdtS.time;
             }
         }
 
@@ -1463,7 +1467,7 @@ gribapiScanTimestep2(stream_t *streamptr)
             break;
           else
             {
-              if (datetime_differ(datetime, datetime0)) break;
+              if (datetime_differ(cdtV, datetime0)) break;
 
               gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2);
               continue;
@@ -1478,7 +1482,7 @@ gribapiScanTimestep2(stream_t *streamptr)
           char paramstr[32];
           cdiParamToString(param, paramstr, sizeof(paramstr));
           Message("%4d %8d name=%s id=%s ltype=%d lev1=%d lev2=%d vdate=%lld vtime=%d", nrecsScanned, (int) recpos, varname,
-                  paramstr, leveltype1, level1, level2, vDate, vTime);
+                  paramstr, leveltype1, level1, level2, cdtV.date, cdtV.time);
         }
 
       if (gribapiVarCompare(compVar, records[recID], 0) != 0)
@@ -1584,9 +1588,8 @@ gribapiScanTimestep(stream_t *streamptr)
           var_tile_t tiles = dummy_tiles;
           gribGetLevel(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles);
 
-          int vDate, vTime, sDate, sTime;
-          gribapiGetValidityDateTime(gh, &vDate, &vTime, &sDate, &sTime);
-          CmpDateTime datetime = { .date = vDate, .time = vTime };
+          CmpDateTime cdtS;
+          const CmpDateTime cdtV = gribapiGetValidityDateTime(gh, &cdtS);
 
           if (rindex == nrecs) break;
 
@@ -1598,7 +1601,7 @@ gribapiScanTimestep(stream_t *streamptr)
 
           if (rindex == 0)
             {
-              datetime0 = datetime;
+              datetime0 = cdtV;
               const int taxisID = vlistInqTaxis(vlistID);
               if (taxisInqType(taxisID) == TAXIS_RELATIVE)
                 {
@@ -1612,18 +1615,18 @@ gribapiScanTimestep(stream_t *streamptr)
                 }
               taxis->fdate = (int) cdiDate_get(taxis->rdatetime.date);
               taxis->ftime = cdiTime_get(taxis->rdatetime.time);
-              taxis->vdatetime = cdiDateTime_set(vDate, vTime);
-              taxis->sdate = sDate;
-              taxis->stime = sTime;
+              taxis->vdatetime = cdiDateTime_set(cdtV.date, cdtV.time);
+              taxis->sdate = cdtS.date;
+              taxis->stime = cdtS.time;
               // printf("n: %d %6d  %d %6d  %d %6d\n", taxis->rdate, taxis->rtime, taxis->sdate, taxis->stime, taxis->vdate,
               // taxis->vtime);
             }
           else
             {
-              if (sDate < taxis->sdate || (sDate == taxis->sdate && sTime < taxis->stime))
+              if (cdtS.date < taxis->sdate || (cdtS.date == taxis->sdate && cdtS.time < taxis->stime))
                 {
-                  taxis->sdate = sDate;
-                  taxis->stime = sTime;
+                  taxis->sdate = cdtS.date;
+                  taxis->stime = cdtS.time;
                 }
             }
 
@@ -1658,7 +1661,7 @@ gribapiScanTimestep(stream_t *streamptr)
             {
               if (records[recID].used)
                 {
-                  if (datetime_differ(datetime, datetime0)) break;
+                  if (datetime_differ(cdtV, datetime0)) break;
 
                   if (CDI_Debug)
                     gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2);
@@ -1670,7 +1673,7 @@ gribapiScanTimestep(stream_t *streamptr)
           records[recID].used = true;
           streamptr->tsteps[tsID].recIDs[rindex] = recID;
 
-          if (CDI_Debug) Message("%4d %8d %4d %8d %8lld %6d", rindex + 1, (int) recpos, param, level1, vDate, vTime);
+          if (CDI_Debug) Message("%4d %8d %4d %8d %8lld %6d", rindex + 1, (int) recpos, param, level1, cdtV.date, cdtV.time);
 
           if (gribapiVarCompare(compVar, records[recID], 0) != 0)
             {
@@ -1682,7 +1685,7 @@ gribapiScanTimestep(stream_t *streamptr)
           records[recID].position = recpos;
           records[recID].size = recsize;
 
-          if (CDI_Debug) Message("%4d %8d %4d %8d %8lld %6d", rindex, (int) recpos, param, level1, vDate, vTime);
+          if (CDI_Debug) Message("%4d %8d %4d %8d %8lld %6d", rindex, (int) recpos, param, level1, cdtV.date, cdtV.time);
 
           grib_handle_delete(gh);
           gh = NULL;