124

Day-of-week: Allowed range 0 – 7. Sunday is either 0 or 7.

I found this after Googling, my question is why should both values (0,7) correspond to Sunday?

Ruban Savvy
  • 8,659

4 Answers4

139

This is a matter of portability. In early Unices, some versions of cron accepted 0 as Sunday, and some accepted 7 as Sunday -- this format is an attempt to be portable with both. From man 5 crontab in vixie-cron (emphasis my own):

When specifying day of week, both day 0 and day 7 will be considered Sunday. BSD and AT&T seem to disagree about this.

Chris Down
  • 125,559
  • 25
  • 270
  • 266
  • 46
    There are 10 kinds of people, those who start counting with 0 and those who start with 1. – Hagen von Eitzen Dec 20 '13 at 13:17
  • 38
    @HagenvonEitzen I remember the joke differently: There are 10 kinds of people, those who understand binary and those who don't. -- Also: There are 2 kinds of people: (1.) those who start counting with 1, (1.) those who start with 0. – leemes Dec 20 '13 at 13:49
  • 8
    I have another version - there are three kinds of people in the world - those that can count and those that cant. – flurbius Dec 20 '13 at 14:59
  • 29
    Or: There are two types of people. Those that can extrapolate from incomplete data. – Bernhard Dec 20 '13 at 15:14
  • 24
    Or: There are 10 types of people in the world - those who understand Gray code, those who don't and those who expected a joke about binary. – OnoSendai Dec 20 '13 at 15:22
  • Jokes aside, I think this was a good compromise. One of the Unices could have been an asshole about it and chosen that 0=Monday instead. Now we have two somewhat compatible standards. – nitro2k01 Dec 20 '13 at 15:59
  • At least OpenBSD does not disagree about both 0 and 7 being Sunday. – kurtm Dec 24 '13 at 03:38
  • @kurtm Right, this probably refers to 4.4BSD or similar. – Chris Down Dec 24 '13 at 03:40
  • @ChrisDown Possibly. Or perhaps before the BSDs brought in much of POSIX. Although looking closely, it seems OpenBSD grabbed vixie cron at one point in the past for their cron implementation. – kurtm Dec 24 '13 at 03:42
  • 1
    Or (a more explicit variation of OnoSendai's): There are 10 types of people in the world: those who understand binary, those who don't, and those who didn't expect the joke to be in base-3. – Dolph Oct 29 '14 at 13:51
  • 2
    The band "Zero 7" is actually pronounced "Sunday Sunday". – Buttle Butkus May 06 '15 at 20:07
  • Answer upvoted because the jokes in the comments are so good. – Tom Anderson Sep 23 '19 at 10:29
28

In addition to @ChrisDown's excellent answer, this might also be a nifty solution to a localisation issue: "According to the Hebrew calendars and traditional Christian calendars, Sunday is the first day of the week." Having it both ways, which is really easy programmatically, makes it easy to use for either group.

l0b0
  • 51,350
3

There is widespread disagreement as to which day of the week makes sense to be considered the first.

Historically, our seven-day week comes from Genesis, in both the Hebrew Bible and the Christian Bible. But our modern lifestyle with Saturday and Sunday being considered "the weekend" obscures this, and makes it easy to think of Sunday as the last day instead of the first day.

Some natural languages actually encode the perspective of Sunday-as first-day or Sunday-as-last-day into their vocabulary, using ordinal names for some of the days, with Serbian and Portuguese being two examples. In Serbian, Petak means 5th day, but refers to Friday. In Portuguese, sexta-feira means 6th day, but refers to Friday.

In apps I use, some treat Sunday as the first day and others as the last day. Most calendar apps seem to allow the user to configure this, but not all apps do that.

The compromise made by cron is quite clever, actually, allowing some users to have their preference as long as they are willing to use a 0-based array, and others to have theirs as long as they are willing to use a 1-based array.

iconoclast
  • 9,198
  • 13
  • 57
  • 97
2

More simply, the field is 3 binary bits giving you 000 through 111 or 0 through 7. So there are a total of eight values in a 3 bit field. The extra value is equated to the first so, for convenience sake, you can start at 0 (Sunday) or 1 (Monday), increment 6 times and cover a full week.