gmtime.c
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:6k
开发平台:

MultiPlatform

  1. /* gmtime.c - gmtime file for time */
  2. /* Copyright 1992-1996 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01g,15oct96,dbt Used reentrant version of ldiv in getTime (fixed SPR #3795).
  7. 01f,12aug96,dbt modified __getTime to treat time_t as an unsigned (SPR #6178).  
  8. 01e,21jun96,dbt modified function __jullday (for leap year just test month > 1)
  9. modified call to jullday in __getTime in order to give it a 
  10. year as found in a tm structure, e.g. "96" (SPR #4251)
  11. Updated copyright.
  12. 01f,24aug94,ism fixed problem with bus error in time conversion (SPR #3542)
  13. -fixed problem with negative time values
  14. -fixed problem with leap year in negative years (SPR #3576)
  15. 01e,24sep93,jmm  __julday() now checks for february 29th as a leap year 
  16. 01d,05feb93,jdi  documentation cleanup for 5.1.
  17. 01c,13nov92,dnw  changed slong_t decls to long
  18. 01b,20sep92,smb  documentation additions
  19. 01a,25jul92,smb  written.
  20. */
  21. /*  
  22. DESCRIPTION  
  23.   
  24. INCLUDE FILE: time.h, stdlib.h
  25.    
  26. SEE ALSO: American National Standard X3.159-1989 
  27. NOMANUAL
  28. */
  29. #include "vxWorks.h"
  30. #include "time.h"
  31. #include "stdlib.h"
  32. #include "private/timeP.h"
  33. /****************************************************************************
  34. *
  35. * gmtime - convert calendar time into UTC broken-down time (ANSI)
  36. *
  37. * This routine converts the calendar time pointed to by <timer> into
  38. * broken-down time, expressed as Coordinated Universal Time (UTC).
  39. *
  40. * INCLUDE FILES: time.h
  41. *
  42. * RETURNS:
  43. * A pointer to a broken-down time structure (`tm'), or a null pointer
  44. * if UTC is not available.
  45. */
  46. struct tm *gmtime
  47.     (
  48.     const time_t *timer /* calendar time in seconds */
  49.     )
  50.     {
  51.     static struct tm timeBuffer;
  52.     gmtime_r (timer, &timeBuffer);
  53.     return (&timeBuffer);
  54.     }
  55. /****************************************************************************
  56. *
  57. * gmtime_r - convert calendar time into broken-down time (POSIX)
  58. *
  59. * This routine converts the calendar time pointed to by <timer> into
  60. * broken-down time, expressed as Coordinated Universal Time (UTC).
  61. * The broken-down time is stored in <timeBuffer>.
  62. *
  63. * This routine is the POSIX re-entrant version of gmtime().
  64. *
  65. * INCLUDE FILES: time.h
  66. *
  67. * RETURNS: OK.
  68. */
  69. int gmtime_r
  70.     (
  71.     const time_t *timer, /* calendar time in seconds */
  72.     struct tm *   timeBuffer /* buffer for broken down time */
  73.     )
  74.     {
  75.     return (__getTime (*timer, timeBuffer));
  76.     }
  77. /************************************************************************
  78. *
  79. * __getTime - convert calendar time into broken-down time 
  80. *
  81. * internal routine.
  82. *
  83. * RETURNS: OK
  84. * NOMANUAL
  85. */
  86. int __getTime
  87.     (
  88.     const time_t timer, /* time represented as seconds from epoch */
  89.     struct tm *  tmp /* pointer to broken-down time structure */
  90.     )
  91.     {
  92.     long days;
  93.     long timeOfDay;
  94.     long year;
  95.     long mon;
  96.     ldiv_t result; 
  97.     /* Calulate number of days since epoch */
  98.     days = timer / SECSPERDAY;
  99.     timeOfDay = timer % SECSPERDAY;
  100.     /* If time of day is negative, subtract one day, and add SECSPERDAY
  101.      * to make it positive.
  102.      */
  103.     if(timeOfDay<0)
  104.      {
  105. timeOfDay+=SECSPERDAY;
  106. days-=1;
  107.      }
  108.     /* Calulate number of years since epoch */
  109.     year = days / DAYSPERYEAR;
  110.     while ( __daysSinceEpoch (year, 0) > days )
  111.      year--;
  112.     /* Calulate the day of the week */
  113.     tmp->tm_wday = (days + EPOCH_WDAY) % DAYSPERWEEK;
  114. /*
  115.  * If there is a negative weekday, add DAYSPERWEEK to make it positive
  116.  */
  117. if(tmp->tm_wday<0)
  118. tmp->tm_wday+=DAYSPERWEEK;
  119.     /* Find year and remaining days */
  120.     days -= __daysSinceEpoch (year, 0);
  121.     year += EPOCH_YEAR;
  122.     /* Find month */
  123.     /* __jullday needs years since TM_YEAR_BASE (SPR 4251) */
  124.     for  ( mon = 0; 
  125.          (days >= __julday (year - TM_YEAR_BASE, mon + 1, 0)) && (mon < 11); 
  126.          mon++ )
  127. ;
  128.     /* Initialise tm structure */
  129.     tmp->tm_year = year - TM_YEAR_BASE; /* years since 1900 */
  130.     tmp->tm_mon  = mon;
  131.     tmp->tm_mday = (days - __julday (tmp->tm_year, mon, 0)) + 1;
  132.     tmp->tm_yday = __julday (tmp->tm_year, mon, tmp->tm_mday) - 1;
  133.     tmp->tm_hour = timeOfDay / SECSPERHOUR;
  134.     timeOfDay  %= SECSPERHOUR;
  135.     ldiv_r (timeOfDay, SECSPERMIN, &result);
  136.     tmp->tm_min = result.quot;
  137.     tmp->tm_sec = result.rem;
  138.     return(OK);
  139.     }
  140. /************************************************************************
  141. *
  142. *  daysSinceEpoch - calculate number days since ANSI C epoch                 
  143. *  The (year + 1)/4 term accounts for leap years, the     
  144. *  first of which was 1972 & should be added starting '73 
  145. * RETURNS:
  146. * NOMANUAL
  147. */
  148. int __daysSinceEpoch
  149.     ( 
  150.     int year, /* Years since epoch */
  151.     int yday  /* days since Jan 1  */
  152.     )
  153.     {
  154. if(year>=0) /* 1970 + */
  155.      return ( (365 * year) + (year + 1) / 4  + yday );
  156. else /* 1969 - */
  157.      return ( (365 * year) + (year - 2) / 4  + yday );
  158.     } 
  159. /************************************************************************
  160. *
  161. * julday - calculate Julian Day given year, month, day            
  162. *              Inputs      : year (years since 1900), month (0 - 11), 
  163. *           day (1 - 31)  
  164. *              Comment     : Returns Julian day in range 1:366.  
  165. *      Unix wants 0:365 
  166. * RETURNS: Julian day                                            
  167. * NOMANUAL
  168. */
  169. int __julday
  170.     ( 
  171.     int yr, /* year */
  172.     int mon, /* month */
  173.     int day /* day */
  174.     )
  175.     {
  176.     static jdays[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  177.     int leap = 0;
  178.     if (isleap (yr + TM_YEAR_BASE))
  179. {
  180. /*
  181.  * If it is a leap year, leap only gets set if the day is
  182.  * after beginning of March (SPR #4251).
  183.  */
  184. if (mon > 1)
  185.     leap = 1;
  186. }
  187.     return (jdays [mon] + day + leap );
  188.     }