© serviceprofessionalgmbh

Die Konvertierfunktionen von DATE() sind leider nicht auf allen Plattformen gleich. Wir zeigen deshalb nachfolgend ein Beispiel, welches immer funktioniert. Kann ausgeschlossen werden, dass die Funktion außerhalb von OS/390 benutzt werden soll, wäre der Mehraufwand an Codeing nicht zu rechtfertigen.

/* REXX
   Eingabe: tt.mm.jjjj,[-]n       Ausgabe: tt.mm.jjjj
*/
arg datum,tage
parse var datum #tt "." #mm "." #jjjj
#tage_m="31 28 31 30 31 30 31 31 30 31 30 31"
#tage_j="365"
if schaltjahr(#jjjj) then do
   #tage_m=overlay('9',#tage_m,5,1)
   #tage_j="366"
end
#ttt=#tt
do idx=1 to #mm-1
   #ttt=#ttt + word(#tage_m,idx)
end
#ttt=right(#ttt,3,'0')
#tt1=#ttt + tage
select
   when #tt1 > #tage_j then do  /** ins nächste Jahr *****/
      do while #tt1 > #tage_j
         if schaltjahr(#jjjj) then #tage_j=366
         else #tage_j=365
         #jjjj=#jjjj+1
         #tt1=#tt1-#tage_j
      end
   end
   when #tt1 < 1       then do  /** ins letzte Jahr   *****/
      do while #tt1 < 1
         #jjjj=#jjjj-1
         if schaltjahr(#jjjj) then #tage_j=366
         else #tage_j=365
         #tt1=#tt1+#tage_j
      end
   end
   otherwise nop
end
return dj2dn(#jjjj!!right(#tt1,3,0))

SCHALTJAHR: PROCEDURE
arg JAHR
RETURN (JAHR // 4 = 0) - (JAHR // 100 = 0) + (JAHR // 400 = 0)

DJ2DN: /* Date Julian to Date Normal */
   parse value arg(1) with 1 JJJJ 5 TTT
   MON="31 28 31 30 31 30 31 31 30 31 30 31"
   if schaltjahr(JJJJ) then MON=overlay('9',MON,5,1)
   do CNT=1 while TTT > word(MON,cnt)
      TTT=TTT-word(MON,cnt)
   end
return right(TTT,2,0)"."right(CNT,2,0)"."JJJJ
zurück zu Datum & Zeit