A system z STCK instruction gives the number of microseconds since Jan 1st 1900. The Unix time is based on Jan 1st 1970.
I needed to convert a STCK to a Unix time.
Convert a STCK to seconds and microseconds.
Bit 51 of the STCK instructions represents 1 microsecond.
// get the STCK value
unsigned long long stck, stck2;
__stckf(&stck); // use store clock fast
// convert STCK to microseconds
stck2 = stck >>12;
int seconds = stck2/1000000; // 1 million
int microseconds = stck2%1000000
Because the STCK will overflow on September 17, 2042, you should be using the STCKE instruction. The format of the STCKE is a one byte epoch, the STCK value, and other data.
To get the time in seconds
unsigned long longstck4
char stcke[16];
__stcke(&stcke);
memcpy(&stck4,&stcke,8); // only get the relevant part
stck4 = stck4>>4; // shift it 4, (STCK shifts 12)
seconds= stck4/1000000;
Get the unix time
time_t t = time();
This time will overflow on January 19, 2038.
You can use
#define _LARGE_TIME_API
#include <time.h>
...
time64_t t64 ;
time64(&t64);
and t64 is a long long integer.
Converting STCK seconds to Unix time
UnixSeconds = STCKSeconds – 2208988800;
and the number of micro seconds is the same.
Format it
To format it see here.