home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / PPL4C11.ZIP / ZDATE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-18  |  3.1 KB  |  134 lines

  1. /* zdate.c */
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "datetime.h"
  6. #include "zdate.h"
  7.  
  8. #define DEBUG 0
  9.  
  10. #define BYTE unsigned char
  11. #define WORD unsigned int
  12.  
  13. #define  K1970  2440588L
  14. #define  K0        1461L
  15. #define  K1      146097L
  16. #define  K2     1721119L
  17.  
  18. void Greg2Julian(WORD Year,WORD Month,WORD Day,long *Julian)
  19. {long Century;
  20.  long XYear;
  21. #if DEBUG
  22.  printf("G2J: Year=%d Month=%d Day=%d\n",Year,Month,Day);
  23. #endif
  24.  if(Month <= 2)
  25.     {Year--;
  26.      Month += 12;
  27.     }
  28.  Month -= 3;
  29.  Century = Year / 100;
  30.  Century = (Century * K1) >> 2;
  31.  XYear = Year % 100;
  32.  XYear = (XYear * K0) >> 2;
  33.  *Julian = ((((153L * (long)Month) + 2L) / 5L) + (long)Day)
  34.            + K2 + XYear + Century;
  35. #if DEBUG
  36.  printf("***: (153*Month+2)/5=%ld\n", ((153L*(long)Month)+2L)/5L );
  37.  printf("G2J: Century=%ld XYear=%ld Julian=%ld\n",Century,XYear,*Julian);
  38. #endif
  39. }
  40.  
  41. void Julian2Greg(long Julian,WORD *Year,WORD *Month,WORD *Day)
  42. {long Temp;
  43.  long XYear;
  44.  WORD YYear;
  45.  WORD YMonth;
  46.  WORD YDay;
  47. #if DEBUG
  48.  printf("J2G: Julian=%ld\n",Julian);
  49. #endif
  50.  Temp = (((Julian - K2) << 2) - 1);
  51.  XYear = (Temp % K1) | 3;
  52.  Julian = Temp / K1;
  53.  YYear = (XYear / K0);
  54.  Temp = ((((XYear % K0) + 4) >> 2) * 5) - 3;
  55.  YMonth = Temp / 153;
  56.  if(YMonth >= 10)
  57.     {YYear++;
  58.      YMonth -= 12;
  59.     }
  60.  YMonth += 3;
  61.  YDay = Temp % 153;
  62.  YDay = (YDay + 5) / 5;
  63.  *Year = YYear + (WORD)(Julian * 100);
  64.  *Month = YMonth;
  65.  *Day = YDay;
  66. #if DEBUG
  67.  printf("J2G: Year=%d Month=%d Day=%d\n",*Year,*Month,*Day);
  68. #endif
  69. }
  70.  
  71. void Dos2Zdate(WORD Date,WORD Time,char *Text,int Length)
  72. {int  i, n;
  73.  char c;
  74.  BYTE Year;
  75.  BYTE Month;
  76.  BYTE Day;
  77.  BYTE Hour;
  78.  BYTE Minute;
  79.  BYTE Second;
  80.  long SecsPast;
  81.  long Julian;
  82.  long DaysPast;
  83.  /* begin */
  84.  UnpackDate(Date,&Year,&Month,&Day);
  85.  UnpackTime(Time,&Hour,&Minute,&Second);
  86.  Greg2Julian((WORD)(1900+Year),(WORD)Month,(WORD)Day,&Julian);
  87.  DaysPast = Julian - K1970;
  88.  SecsPast = 86400L * DaysPast;
  89.  SecsPast = SecsPast + (long)Hour * 3600L + (long)Minute * 60L
  90.               + (long)Second;
  91. #if DEBUG
  92.  printf("SecsPast=%ld\n",SecsPast);
  93. #endif
  94.  /* extract octal digits */
  95.  n = Length - 1;
  96.  Text[n--] = '\0';
  97.  while( (SecsPast!=0L) && (n>=0) )
  98.    {c = (char) ((SecsPast&0x07)+0x30);
  99.     Text[n--] = c;
  100.     SecsPast >>= 3;
  101.    }
  102.         /*while(n>=0) Text[n--] = '0'; */
  103.  /* left justify with single leading 0 */
  104.  Text[n] = '0';
  105.  for(i=0;i<Length-n;i++) Text[i] = Text[i+n];
  106. }
  107.  
  108. void Z2DosDate(char *Text,WORD *Date, WORD *Time)
  109. {int  n;
  110.  WORD Year;
  111.  WORD Month;
  112.  WORD Day;
  113.  WORD Hour;
  114.  WORD Minute;
  115.  WORD Second;
  116.  long SecsPast;
  117.  long Julian;
  118.  long DaysPast;
  119.  WORD Length;
  120.  Length = strlen(Text);
  121.  SecsPast = 0L;
  122.  for(n=0;n<Length;n++)
  123.    SecsPast = (SecsPast << 3) + (Text[n] - 0x30);
  124.  Julian = (SecsPast / 86400) + K1970;
  125.  Julian2Greg(Julian,&Year,&Month,&Day);
  126.  SecsPast = SecsPast % 86400;
  127.  Hour = SecsPast / 3600;
  128.  SecsPast = SecsPast % 3600;
  129.  Minute = SecsPast / 60;
  130.  Second = SecsPast % 60;
  131.  PackDate((BYTE)(Year-1900),(BYTE)Month,(BYTE)Day,(WORD *)Date);
  132.  PackTime((BYTE)Hour,(BYTE)Minute,(BYTE)Second,(WORD *)Time);
  133. }
  134.