![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: I need the inverse function for LIB$DAY(). I have been trying various combinations of LIB$CVT_TO_INTERNAL_TIME (and FROM) and trying to add a delta time. I seem to be able to store DELTA_DAYS in internal format but when I use LIB$ADD_TIMES to add the delt a time to today's date to go back or forth a few days, internal day number doesn't change. If I had the inverse of LIB$DAY my problem would be trivial. Thanks, DGH The Answer is : The terms date and time will here be used largely interchangeably. The LIB$CVT_FROM_INTERNAL_TIME call is designed to pick apart the binary format time, while LIB$CVT_TO_INTERNAL_TIME is designed to create the binary value. LIB$DAY returns the number of days since the base date, or since the specified quadword-format time. The particular question -- the particular manipulation of time you wish to conduct -- is not entirely clear to the OpenVMS Wizard. Though you wish the inverse of lib$day -- to convert the days since base date into a quadword -- you then discuss moving a couple of days forward or back from the current date. The binary equivalent of an absolute date is always a positive value, while a binary delta time is always stored as a negative value. (The various system service and RTL calls that manipulate the quadword date format regularly utilize this fact.) As a start, please see the chapter on time in the Programming Concepts Manual, and please see the attached example: #include <descrip.h> #include <lib$routines.h> #include <ssdef.h> #include <starlet.h> #include <stdio.h> #include <stsdef.h> #define MAXASCTIMLEN 23 #define MAXVECTIMLEN 7 main() { int RetStat; $DESCRIPTOR( TimeTodayAscii, "TODAY"); $DESCRIPTOR( TimeSourceAscii, "01-JAN-1995 00:00:01.00"); $DESCRIPTOR( DeltaTimeSourceAscii, "1 00:00:00"); char TimeSourceBinary[] = { 0x080, 0x0F5, 0x020, 0x000, 0x000, 0x000, 0x000, 0x000}; struct dsc$descriptor FormattedTimeDesc; char FormattedTimeBuffer[MAXASCTIMLEN]; unsigned char *TimeBinaryPtr; int TimeBinaryQW[2]; int TodayBinaryQW[2]; int DeltaTimeBinaryQW[2]; int NewTimeBinaryQW[2]; int DaysSinceBaseDate; unsigned short int VecTim[MAXVECTIMLEN]; int i; /* // example 1: // Convert time from binary to ASCII. */ FormattedTimeDesc.dsc$w_length = MAXASCTIMLEN; FormattedTimeDesc.dsc$b_dtype = DSC$K_DTYPE_T; FormattedTimeDesc.dsc$b_class = DSC$K_CLASS_S; FormattedTimeDesc.dsc$a_pointer = FormattedTimeBuffer; RetStat = sys$asctim( 0, &FormattedTimeDesc, TimeSourceBinary, 0 ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; RetStat = lib$put_output( &FormattedTimeDesc ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; /* // example 2: // Convert time from ASCII to binary and back to ASCII. */ RetStat = sys$bintim( &TimeSourceAscii, TimeBinaryQW ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; RetStat = sys$asctim( 0, &FormattedTimeDesc, TimeBinaryQW, 0 ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; TimeBinaryPtr = (unsigned char *) TimeBinaryQW; printf("0x0%2.2x 0x0%2.2x 0x0%2.2x 0x0%2.2x 0x0%2.2x 0x0%2.2x 0x0%2.2x 0x0%2.2x\n", TimeBinaryPtr[0], TimeBinaryPtr[1], TimeBinaryPtr[2], TimeBinaryPtr[3], TimeBinaryPtr[4], TimeBinaryPtr[5], TimeBinaryPtr[6], TimeBinaryPtr[7] ); RetStat = lib$put_output( &FormattedTimeDesc ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; /* // Example 3: // Display the number of days between the base date and the // specified binary time... */ RetStat = lib$day( &DaysSinceBaseDate, TimeBinaryQW, NULL ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; printf("Days Since Base Date for %*.*s: %d\n", TimeSourceAscii.dsc$w_length, TimeSourceAscii.dsc$w_length, TimeSourceAscii.dsc$a_pointer, DaysSinceBaseDate ); /* // Example 4: // Display the number of days since the base date for today... // Add some times together and then display the number of days... // Subtract some times and then display the number of days... */ RetStat = sys$gettim( TodayBinaryQW ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; RetStat = lib$day( &DaysSinceBaseDate, TodayBinaryQW, NULL ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; printf("Days Since Base Date Today: %d\n", DaysSinceBaseDate ); RetStat = sys$bintim( &DeltaTimeSourceAscii, DeltaTimeBinaryQW ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; RetStat = lib$add_times( TodayBinaryQW, DeltaTimeBinaryQW, NewTimeBinaryQW ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; RetStat = lib$day( &DaysSinceBaseDate, NewTimeBinaryQW, NULL ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; printf("Days Since Base Date Tomorrow: %d\n", DaysSinceBaseDate ); RetStat = lib$sub_times( TodayBinaryQW, DeltaTimeBinaryQW, NewTimeBinaryQW ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; RetStat = lib$day( &DaysSinceBaseDate, NewTimeBinaryQW, NULL ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; printf("Days Since Base Date Yesterday: %d\n", DaysSinceBaseDate ); /* // Example 5: // Convert from a quadword into a time vector... // Then reconstitute the quadword from the vector... */ RetStat = sys$numtim( VecTim, TimeBinaryQW ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; for (i = 0; i < MAXVECTIMLEN; i++ ) printf("VecTim[%d] = %d\n", i, VecTim[i] ); RetStat = lib$cvt_vectim( VecTim, NewTimeBinaryQW ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; RetStat = sys$asctim( 0, &FormattedTimeDesc, NewTimeBinaryQW, 0 ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; RetStat = lib$put_output( &FormattedTimeDesc ); if (!$VMS_STATUS_SUCCESS( RetStat )) return RetStat; return SS$_NORMAL; }
|