home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / SREFPRC1 / JULDATE.SRF < prev    next >
Text File  |  1996-07-03  |  3KB  |  77 lines

  1. /***************************************/
  2. /* calculate days based on 0000/01/01 (= 1. day == 1) */
  3. /* INPUT SHOULD BE: YYYYMMDD HR:MINUTE:SECOND */
  4. /* RETURNS # DAYS SINCE 0 0 1 (AND FRACTION OF DAY) */
  5. /* THE heart of this routine from the DATERGF function written by:
  6.          Rony G. Flatscher,
  7.          Wirtschaftsuniversität/Vienna
  8.          Rony.Flatscher@wu-wien.ac.at
  9. */
  10.  
  11.  
  12.  
  13. sref_JULDATE:
  14.  
  15.     PARSE upper ARG  mode, atime
  16.    if abbrev(mode,'F') then do          /* yy/mm/dd/hh/mm/ss mode */
  17.         atime=translate(atime,' ','\/')
  18.         parse var atime year month day  hr minute second
  19.         year=1900+year
  20.    end
  21.    else do
  22.       PARSE VAR atime 1 year 5 month 7 day 9 TIME
  23.       PARSE VAR TIME HR ":" MINUTE ":" SECOND .
  24.    end
  25.    if second="" then second=0
  26. /* build monthdays array */
  27.  
  28. numeric digits 11
  29.  
  30.     monthdays.1 = 31  ; monthdays.2 = 28 ; monthdays.3 = 31
  31.     monthdays.4 = 30 ;monthdays.5 = 31 ; monthdays.6 = 30
  32.     monthdays.7 = 31; monthdays.8 = 31 ;monthdays.9 = 30
  33.     monthdays.10 = 31; monthdays.11 = 30 ; monthdays.12 = 31
  34.  
  35.     days_1    = year * 365
  36.     leap_days = year % 4
  37.  
  38.     IF year > 0 THEN
  39.     DO
  40.        leap_days = leap_days + 1        /* account for leap year in 0000 */
  41.  
  42.        IF year > 1582 THEN days_1 = days_1 - 10 /* account for 1582, which had 10 days less */
  43.  
  44.        IF year > 1600 THEN         /* account for Gregorian calender */
  45.        DO
  46.            diff = year - 1600
  47.            leap_days = leap_days - (diff % 100 - diff % 400)
  48.            leap_year = (((diff // 4) = 0) & \((diff // 100) = 0)) | ((diff // 400)=0) /* leap year in hand ? */
  49.        END
  50.        ELSE leap_year = ((year // 4) = 0)       /* leap year in hand ? */
  51.  
  52.        leap_days = leap_days - leap_year
  53.     END
  54.  
  55.  
  56.   /* is year a leap year ? */
  57.     IF year > 1582 THEN                 /* Gregorian calender */
  58.        leap_year = (((year // 4) = 0) & \((year // 100) = 0)) | ((year // 400)=0)
  59.     ELSE leap_year = (year // 4) = 0    /* Julian calender    */
  60.     monthdays.2 = 28 + leap_year
  61.     IF year = 1582 THEN monthdays.10 = 21       /* 1582: October just had 21 days */
  62.     result_function = 0
  63.     DO i = 1 TO month - 1
  64.        result_function = result_function + monthdays.i
  65.     END
  66.     IF year = 1582 & month = 10 & day > 4 THEN day = day - 10       /* Gregorian: 10 days too many */
  67.     days_2 = result_function + day
  68.  
  69.   T1=(((HR*60)+MINUTE)*60)+SECOND
  70.   T2=3600*24
  71.   FRACT=T1/T2
  72.  
  73.     jd= (days_1 + leap_days + days_2 + FRACT )
  74. /*say mode year month day hr minute second " ,  " jd */
  75. return jd
  76.  
  77.