From decwrl!labrea!rutgers!mailrus!tut.cis.ohio-state.edu!ucbvax!unisoft!uunet!allbery Sat Feb 4 10:50:45 PST 1989 Article 812 of comp.sources.misc: Path: granite!decwrl!labrea!rutgers!mailrus!tut.cis.ohio-state.edu!ucbvax!unisoft!uunet!allbery From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) Newsgroups: comp.sources.misc Subject: v06i037: Evaluate if a date is DST or not Message-ID: <48166@uunet.UU.NET> Date: 4 Feb 89 03:22:00 GMT Sender: allbery@uunet.UU.NET Reply-To: dg@lakart.UUCP (David Goodenough) Lines: 77 Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) Posting-number: Volume 6, Issue 37 Submitted-by: dg@lakart.UUCP (David Goodenough) Archive-name: isdst [Does this critter deal with DST ambiguities like the recent change? ++bsa] For a project I'm doing, I needed to know if a given date was Daylight Savings or not. After searching long and hard, I dicovered that in the United States at least, the changes are always the last Sunday of April and October. The following algorithm will take a date in day, month, year, century form, and tell if it is DST or not: it returns zero if not DST, and 1 if the date is DST. Caveat: it assumes that the changeover is at midnight: it doesn't understand about the time slip at 2AM. However as long as you aren't up at 2AM I don't predict this will be a problem. As a freebie, it also includes a function that will evaluate the day of the week for a given date. This function returns a number between 0 and 6, where 0 means Sunday, 1 is Monday etc., and 6 is Saturday. -- dg@lakart.UUCP - David Goodenough +---+ IHS | +-+-+ ....... !harvard!xait!lakart!dg +-+-+ | AKA: dg%lakart.uucp@xait.xerox.com +---+ --- cut here --- cut here --- cut here --- cut here --- cut here --- #! /bin/sh # This file was wrapped with "dummyshar". "sh" this file to extract. # Contents: isdst.c echo extracting 'isdst.c' if test -f 'isdst.c' -a -z "$1"; then echo Not overwriting 'isdst.c'; else sed 's/^X//' << \EOF > 'isdst.c' Xint isdst(day, month, year, cent) Xint day, month, year, cent; X { X if (month < 4 || month > 10) X return(0); /* months 1 - 3, and 11, 12 are always not DST */ X if (month > 4 && month < 10) X return(1); /* months 5 - 9 are always DST */ X X /* see if there's a Sunday in the month after our day. */ X X while (++day <= ((month == 4) ? 30 : 31)) X if (dayofweek(day, month, year, cent) == 0) X return(month == 10); /* found one: that means we're before the X * changeover, so 4 => not DST, 10 => DST */ X X return(month == 4); /* failed, so we're after the changeover, X * so 4 => DST, 10 => not DST */ X } X Xint dayofweek(day, month, year, cent) Xint day, month, year, cent; X { X /* This has it's roots in the Roman calendar, where the first X * month was Mar, and Jan and Feb were months 11 and 12 of X * the previous year */ X if ((month = month - 2) < 1) /* back month by two, but check for wrap */ X { X month = month + 12; /* reset to end of last year */ X if (year-- == 0) /* reduce year number */ X { X year = 99; /* and adjust for century wrap if needed */ X cent--; X } X } X return(((13 * month - 1) / 5 + day + year + year / 4 + X cent / 4 - 2 * cent) % 7); X /* I don't have a clue how this got dreamed X * up, but it works. If memory serves I first X * saw it in the British Science Museum, in X * London, England */ X } EOF chars=`wc -c < 'isdst.c'` if test $chars != 1425; then echo 'isdst.c' is $chars characters, should be 1425 characters!; fi fi exit 0