home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / isdst < prev    next >
Internet Message Format  |  1989-02-03  |  3KB

  1. Path: lll-winken!ames!mailrus!tut.cis.ohio-state.edu!ucbvax!unisoft!uunet!allbery
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Newsgroups: comp.sources.misc
  4. Subject: v06i037: Evaluate if a date is DST or not
  5. Message-ID: <48166@uunet.UU.NET>
  6. Date: 4 Feb 89 03:22:00 GMT
  7. Sender: allbery@uunet.UU.NET
  8. Reply-To: dg@lakart.UUCP (David Goodenough)
  9. Lines: 77
  10. Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  11.  
  12. Posting-number: Volume 6, Issue 37
  13. Submitted-by: dg@lakart.UUCP (David Goodenough)
  14. Archive-name: isdst
  15.  
  16. [Does this critter deal with DST ambiguities like the recent change?  ++bsa]
  17.  
  18. For a project I'm doing, I needed to know if a given date was Daylight
  19. Savings or not. After searching long and hard, I dicovered that in the
  20. United States at least, the changes are always the last Sunday of April
  21. and October. The following algorithm will take a date in day, month,
  22. year, century form, and tell if it is DST or not: it returns zero if
  23. not DST, and 1 if the date is DST. Caveat: it assumes that the
  24. changeover is at midnight: it doesn't understand about the time slip at
  25. 2AM. However as long as you aren't up at 2AM I don't predict this will
  26. be a problem. As a freebie, it also includes a function that will
  27. evaluate the day of the week for a given date. This function returns a
  28. number between 0 and 6, where 0 means Sunday, 1 is Monday etc., and 6
  29. is Saturday.
  30. -- 
  31.     dg@lakart.UUCP - David Goodenough        +---+
  32.                         IHS    | +-+-+
  33.     ....... !harvard!xait!lakart!dg            +-+-+ |
  34. AKA:    dg%lakart.uucp@xait.xerox.com                +---+
  35.  
  36. --- cut here --- cut here --- cut here --- cut here --- cut here ---
  37. #! /bin/sh
  38. # This file was wrapped with "dummyshar".  "sh" this file to extract.
  39. # Contents:  isdst.c
  40. echo extracting 'isdst.c'
  41. if test -f 'isdst.c' -a -z "$1"; then echo Not overwriting 'isdst.c'; else
  42. sed 's/^X//' << \EOF > 'isdst.c'
  43. Xint isdst(day, month, year, cent)
  44. Xint day, month, year, cent;
  45. X {
  46. X    if (month < 4 || month > 10)
  47. X      return(0);    /* months 1 - 3, and 11, 12 are always not DST */
  48. X    if (month > 4 && month < 10)
  49. X      return(1);    /* months 5 - 9 are always DST */
  50. X
  51. X    /* see if there's a Sunday in the month after our day. */
  52. X
  53. X    while (++day <= ((month == 4) ? 30 : 31))
  54. X      if (dayofweek(day, month, year, cent) == 0)
  55. X    return(month == 10);    /* found one: that means we're before the
  56. X                 * changeover, so 4 => not DST, 10 => DST */
  57. X
  58. X    return(month == 4);        /* failed, so we're after the changeover,
  59. X                 * so 4 => DST, 10 => not DST */
  60. X }
  61. X
  62. Xint dayofweek(day, month, year, cent)
  63. Xint day, month, year, cent;
  64. X {
  65. X        /* This has it's roots in the Roman calendar, where the first
  66. X         * month was Mar, and Jan and Feb were months 11 and 12 of
  67. X         * the previous year */
  68. X    if ((month = month - 2) < 1) /* back month by two, but check for wrap */
  69. X     {
  70. X    month = month + 12;    /* reset to end of last year */
  71. X    if (year-- == 0)    /* reduce year number */
  72. X     {
  73. X        year = 99;        /* and adjust for century wrap if needed */
  74. X        cent--;
  75. X     }
  76. X     }
  77. X    return(((13 * month - 1) / 5 + day + year + year / 4 +
  78. X                        cent / 4 - 2 * cent) % 7);
  79. X                /* I don't have a clue how this got dreamed
  80. X                 * up, but it works. If memory serves I first
  81. X                 * saw it in the British Science Museum, in
  82. X                 * London, England */
  83. X }
  84. EOF
  85. chars=`wc -c < 'isdst.c'`
  86. if test $chars !=     1425; then echo 'isdst.c' is $chars characters, should be     1425 characters!; fi
  87. fi
  88. exit 0
  89.