![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: I have binary data written to a file by a VAX/VMS executable which includes a date field. How do I convert the vax system time (which appears to be an 8-byte binary number) to a unix epoch time, on (unfortunatly) another platform? The Answer is : Please ask the Wizard of the Target Platform how to convert the number of 100nanosecond intervals since the system base date of November 17, 1858 00:00:00.00 (local time) -- this value is stored in a quadword -- into the particular local time format required. The C epoch is the number of seconds since January 1, 1970 -- this value is stored in a C data cell with a typedef of time_t. If you choose to convert the time on OpenVMS, see the Compaq C RTL call decc$fix_time(). This call converts an OpenVMS binary system time (a 64-bit quadword containing the number of 100-nanosecond ticks since 00:00 November 17, 1858) to a longword containing the number of seconds since 00:00 January 1, 1970, local time. To arrive to Unix time that can be passed to UTC-based ctime() or localtime() functions, call tzset() and add 'timezone' to the value returned by decc$fix_time(). --- #include {stdio.h} #include {time.h} #include {starlet.h} main() { int vms_time[2]; time_t local_time, UTC_time; /* // Get the current time */ sys$gettim(&vms_time[0]); UTC_time = time(NULL); local_time = decc$fix_time(vms_time); /* // local time cannnot be passed to UTC-based ctime() */ puts(ctime(&local_time)); /* // Print the current time */ puts(ctime(&UTC_time)); tzset(); local_time += timezone; /* // Print current time */ puts(ctime(&local_time)); return 1; }
|