home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROSdev.lha / AROS / rom / utility / date2amiga.c < prev    next >
C/C++ Source or Header  |  1997-02-03  |  3KB  |  101 lines

  1. /*
  2.     Copyright (C) 1995-1997 AROS - The Amiga Replacement OS
  3.     $Id: date2amiga.c,v 1.6 1997/02/03 02:58:31 ldp Exp $
  4.  
  5.     Desc: Convert a human understandable date to a machine form.
  6.     Lang: english
  7. */
  8. #include "utility_intern.h"
  9.  
  10. /*****************************************************************************
  11.  
  12.     NAME */
  13. #include <utility/date.h>
  14. #include <proto/utility.h>
  15.  
  16.         AROS_LH1(ULONG, Date2Amiga,
  17.  
  18. /*  SYNOPSIS */
  19.         AROS_LHA(struct ClockData *, date, A0),
  20.  
  21. /*  LOCATION */
  22.         struct UtilityBase *, UtilityBase, 21, Utility)
  23.  
  24. /*  FUNCTION
  25.         Converts the information given in the struct ClockData *date, into
  26.         the number of seconds that have past since the 1st of January 1978.
  27.  
  28.     INPUTS
  29.         date    -   Contains the information about the time.
  30.  
  31.     RESULT
  32.         The number of seconds since 1.1.1978
  33.  
  34.     NOTES
  35.  
  36.     EXAMPLE
  37.  
  38.     BUGS
  39.  
  40.     SEE ALSO
  41.         Amiga2Date(), CheckData()
  42.  
  43.     INTERNALS
  44.         Bit of a hack in the leap year handling.
  45.  
  46.     HISTORY
  47.         29-10-95    digulla automatically created from
  48.                             utility_lib.fd and clib/utility_protos.h
  49.  
  50. *****************************************************************************/
  51. {
  52.     AROS_LIBFUNC_INIT
  53.  
  54.     /* This array contains the number of days that have been in the year
  55.        up to the start of the month. Does not take into account leap years.
  56.     */
  57.     static const UWORD dayspermonth[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
  58.  
  59.     ULONG time;
  60.     UWORD year, leaps;
  61.  
  62.     year = date->year - 1978;
  63.  
  64.     time = date->sec + (date->min * 60) + (date->hour * 3600);
  65.     time += ((date->mday - 1) + dayspermonth[date->month - 1]) * 86400;
  66.     time += year * 31536000;
  67.  
  68.     /* How do we calculate leap years? That is a very good question.
  69.        The year 1978 is NOT a leap year, but 1980 is...
  70.  
  71.        I want to arrange it so that the last year of any four year group
  72.        is a leap year. So the first year I can really deal with is either
  73.        1977 or 1981. So I choose 1977 (the year I was born in :)
  74.  
  75.         Then, to get the number of leap years I divide by 4.
  76.         However, if year is a year which is a leap year, then this year
  77.         will not be counted, so I have to check for this.
  78.  
  79.         If year % 4 == 3, then we are in a leap year, and if the month
  80.         is after February, then I can add a leap year.
  81.     */
  82.  
  83.     year++;
  84.     leaps = year / 4;
  85.     if( (year % 4 == 3) && (date->month > 2))
  86.         leaps++;
  87.  
  88.     /* If the year is greater than the year 2100, or it is the
  89.        year 2100 and after February, then we also have to subtract
  90.        a leap year, as the year 2100 is NOT a leap year.
  91.     */
  92.     if( ( year > 123) || ((year == 123) && (date->month > 2)) )
  93.         leaps--;
  94.  
  95.     time += leaps * 86400;
  96.  
  97.     return time;
  98.  
  99.     AROS_LIBFUNC_EXIT
  100. } /* Date2Amiga */
  101.