CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE NEWTIME(IOLDT,NEWT,IDIF,MSGUN) C This subroutine creates a new time which is IDIF C centiseconds different from the old time. C IS date time units format; i.e. IOLDT & NEWT have 4 elements: C yyyy, mmdd, hhmm, and centiseconds. IDIF is the number of C centiseconds difference. C NOTES: C - Only absolute idif's less than 365 days are programmed at C this time. C - Times >= 24__ are always converted to 00__; i.e. the C largest hhmm returned will be 2359. C - MSGUN is the fortran unit number to print any diagnostic C messages. DIMENSION IOLDT(1),NEWT(1) DIMENSION LMSUM(12),LYS(12),NLS(12),LENM(12) DATA NLS / 0,31,59,90,120,151,181,212,243,273,304,334/ DATA LYS / 0,31,60,91,121,152,182,213,244,274,305,335/ DATA LENM/31,28,31,30 ,31, 30, 31, 31, 30, 31, 30, 31/ SAVE LYS,NLS,LENM IF(ABS(IDIF) .GT. 3153600000)GO TO 9200 IF ( IDIF .LT. 0 ) THEN M6000 = 6000 M60 = 60 M24 = 24 ISGN = -1 ELSE M6000 = -6000 M60 = -60 M24 = -24 ISGN = 1 ENDIF C Reset arrays for leap year: IF(MOD(IOLDT(1),4) .EQ. 0)THEN DO 10 I=1,12 10 LMSUM(I)=LYS(I) LENM(2)=29 LASTDA=366 ELSE DO 20 I=1,12 20 LMSUM(I)=NLS(I) LENM(2)=28 LASTDA=365 ENDIF C Determine # of days, hours, mins and seconds to be added NDIFDA=0 NDIFHR=0 NDIFMI=0 NDIFCS=0 NDIFDA=IDIF/8640000 NDIFHR=(IDIF-NDIFDA*8640000)/360000 NDIFMI=(IDIF-NDIFDA*8640000-NDIFHR*360000)/6000 NDIFCS=(IDIF-NDIFDA*8640000-NDIFHR*360000-NDIFMI*6000) C Convert old time to day # of year & reformat hhmm IOMO=IOLDT(2)/100 IODA=IOLDT(2)-IOMO*100 IOJD=LMSUM(IOMO)+IODA IOHR=IOLDT(3)/100 IOMI=IOLDT(3)-IOHR*100 C Now build new time starting with centi-seconds: NEWCS=IOLDT(4) + NDIFCS ICARRY=0 IF ( NEWCS .GE. 6000 .OR. NEWCS .LT. 0) THEN NEWCS=NEWCS+M6000 ICARRY=ISGN ENDIF NEWT(4)=NEWCS C Make new minutes & hours NEWMI=IOMI + NDIFMI + ICARRY ICARRY=0 IF(NEWMI .GE. 60 .OR. NEWMI .LT. 0)THEN NEWMI=NEWMI+M60 ICARRY= ISGN ENDIF NEWHR=IOHR + NDIFHR + ICARRY ICARRY=0 IF(NEWHR .GE. 24 .OR. NEWHR .LT. 0)THEN NEWHR=NEWHR+M24 ICARRY= ISGN ENDIF NEWT(3)=NEWHR*100 + NEWMI C Make new julian days (i.e. day number of year) NEWJD=IOJD + NDIFDA + ICARRY NEWT(1)=IOLDT(1) IF(NEWJD .GT. LASTDA .OR. NEWJD .LE. 0)THEN NEWT(1)=IOLDT(1)+ISGN IF ( IDIF .GE. 0 ) NEWJD=NEWJD-LASTDA C Reset arrays for leap year: IF(MOD(NEWT(1),4) .EQ. 0)THEN DO 11 I=1,12 11 LMSUM(I)=LYS(I) LENM(2)=29 LASTDA=366 ELSE DO 21 I=1,12 21 LMSUM(I)=NLS(I) LENM(2)=28 LASTDA=365 ENDIF IF ( IDIF .LT. 0 ) NEWJD=NEWJD+LASTDA ENDIF C Now convert day # of year to mmdd DO 30 I=1,12 ITEST=NEWJD-LMSUM(I) IF(ITEST.GT.0 .AND. ITEST.LE.LENM(I))GO TO 40 30 CONTINUE STOP 40 NEWMO=I NEWDA=NEWJD-LMSUM(I) NEWT(2)=NEWMO*100 + NEWDA RETURN 9200 WRITE(MSGUN,'(''0Subroutine NEWTIME has not been tested for '', + ''making new times more'',/, + '' than 365 days from the old time.'')') STOP 'MOR COD' END