Hier noch eine Lösung die beliebige RPG Timestamps zu ISO8601 konvertieren kann.
Code:**free ctl-opt dftactgrp(*no); ctl-opt option(*nodebugio: *srcstmt: *nounref); ctl-opt main(main); dcl-s time_t int(20) template; dcl-pr time like(time_t) extproc(*cwiden: 'time64'); timeval like(time_t) options(*omit); end-pr; dcl-ds struct_tm qualified template; tm_sec int(10); // seconds after the minute (0-61) tm_min int(10); // minutes after the hour (0-59) tm_hour int(10); // hours since midnight (0-23) tm_mday int(10); // day of the month (1-31) tm_mon int(10); // months since January (0-11) tm_year int(10); // years since 1900 tm_wday int(10); // days since Sunday (0-6) tm_yday int(10); // days since January 1 (0-365) tm_isdst int(10); // Daylight Saving Time flag end-ds; dcl-pr gmtime_r pointer extproc(*cwiden: 'gmtime64_r'); timer like(time_t) const; tm like(struct_tm); end-pr; dcl-pr mktime like(time_t) extproc(*cwiden: 'mktime64'); tm like(struct_tm); end-pr; dcl-pr localtime_r pointer extproc(*cwiden: 'localtime64_r'); timer like(time_t) const; tm like(struct_tm); end-pr; dcl-proc main; dsply time(*omit); dsply timestampToEpoch(%timestamp); dsply %timestamp(*sys: 0); dsply epochToTimestamp(timestampToEpoch(%timestamp)); // 1 Stunde UTC-Offset für Winterzeit dsply timestampToISO8601(z'2021-01-01-14.00.00'); // 2 Stunde UTC-Offset für Sommerzeit dsply timestampToISO8601(z'2021-08-01-14.00.00'); // Timestamp innerhalb der überlappung von Sommer- und // Winterzeit wird als Winterzeit interpretiert dsply timestampToISO8601(z'2021-10-31-02.30.00'); // Timestamp innerhalb der übersprungenen // Stunde wird als Winterzeit interpretiert dsply timestampToISO8601(z'2021-03-28-02.30.00'); end-proc; // Konvertiert Unix Epoch Timestamp zu ISO8601 Timestamp dcl-proc epochToISO8601 export; dcl-pi *n char(20); timeval like(time_t) const; end-pi; dcl-ds tm likeds(struct_tm) inz; // tm struct befüllen gmtime_r(timeval: tm); // ISO8601 Timestamp zusammensetzen return %subst(%editc(tm.tm_year + 1900: 'X'): 7: 4) + '-' + %subst(%editc(tm.tm_mon + 1: 'X'): 9: 2) + '-' + %subst(%editc(tm.tm_mday: 'X'): 9: 2) + 'T' + %subst(%editc(tm.tm_hour: 'X'): 9: 2) + ':' + %subst(%editc(tm.tm_min: 'X'): 9: 2) + ':' + %subst(%editc(tm.tm_sec: 'X'): 9: 2) + 'Z'; end-proc; // Konvertiert RPG Timestamp zu ISO8601 Timestamp dcl-proc timestampToISO8601 export; dcl-pi *n char(20); timestamp timestamp(0) const; isdst ind const options(*nopass); end-pi; if %parms = 2; return epochToISO8601(timestampToEpoch(timestamp: isdst)); else; return epochToISO8601(timestampToEpoch(timestamp)); endif; end-proc; // konvertiert UNIX Epoch zu RPG Timestamp dcl-proc epochToTimestamp export; dcl-pi *n timestamp(0); time like(time_t) value; end-pi; dcl-ds tm likeds(struct_tm) inz; localtime_r(time: tm); return %timestamp( %subst(%editc(tm.tm_year + 1900: 'X'): 7: 4) + %subst(%editc(tm.tm_mon + 1: 'X'): 9: 2) + %subst(%editc(tm.tm_mday: 'X'): 9: 2) + %subst(%editc(tm.tm_hour: 'X'): 9: 2) + %subst(%editc(tm.tm_min: 'X'): 9: 2) + %subst(%editc(tm.tm_sec: 'X'): 9: 2): *iso0: 0 ); end-proc; // konvertiert RPG Timestamp zu UNIX Epoch dcl-proc timestampToEpoch export; dcl-pi *n like(time_t); timestamp timestamp(0) const; isdst ind const options(*nopass); end-pi; dcl-ds tm likeds(struct_tm) inz; tm.tm_year = %subdt(timestamp: *years) - 1900; tm.tm_mon = %subdt(timestamp: *months) - 1; tm.tm_mday = %subdt(timestamp: *days); tm.tm_hour = %subdt(timestamp: *hours); tm.tm_min = %subdt(timestamp: *minutes); tm.tm_sec = %subdt(timestamp: *seconds); if %parms = 2; if isdst; tm.tm_isdst = 1; else; tm.tm_isdst = 0; endif; else; tm.tm_isdst = -1; endif; // convert to unix timestamp return mktime(tm); end-proc;
![[NEWSboard IBMi Forum]](images/duke/nblogo.gif)



Mit Zitat antworten
Bookmarks