
Show HN: One Page Calendar 2020 - dbfa
https://davebakker.io/onepagecalendar/
======
j1elo
For the last 3 years I've been printing several copies of the Compact Calendar
by David Seah [1]. It's as its name implies a compact form calendar that spans
the whole year in a single page, and leaves enough side space to annotate
stuff as needed.

It's very cool and useful, although it would be nice having an open-source
based version (i.e. LibreOffice), for those of us that don't have an MS Office
license...

[1]: [https://davidseah.com/node/compact-
calendar/](https://davidseah.com/node/compact-calendar/)

(not sure why but upon checking the website I'm seeing all text and links
scrambled in the page, probably the author inadvertently broke it during an
update)

~~~
j1elo
Wow I just discovered that it's uBlock Origin that totally breaks the page
layout. Which means that for some reason this page's CSS are detected as an ad
source, and blocked! Curious, as it seems to be a plain and simple static
site.

EDIT: It is the "AdGuard Annoyances" optional list, which is disabled by
default but I like to enable: [https://kb.adguard.com/en/general/adguard-ad-
filters#annoyan...](https://kb.adguard.com/en/general/adguard-ad-
filters#annoyances)

~~~
bscphil
It's also blocked by Fanboy's annoyances list. It's a generic blocker, /wp-
gdpr, probably designed to block a Wordpress plugin's GDPR banner. My guess is
this site is using such a plugin, and then stuck the rest of its CSS in the
plugin's folder instead of a generic folder like CSS, so it ends up blocked
there too. You can whitelist this URL on the site if you want without having
to whitelist the site as a whole.

------
yboris
Related: The Compact Calendar by David Seah

[https://davidseah.com/node/compact-
calendar/](https://davidseah.com/node/compact-calendar/)

I print this every year for almost a decade now!

------
kseistrup
This reminds me of the Doomsday algorithm¹. The doomsday for 2020 falls on a
saturday, which is aligned neatly as the diagonal in the one page calendar.
Once you know the doomsday of a given year, you can calculate the day of week
for any date in that year in your head.

[1] [http://rudy.ca/doomsday.html](http://rudy.ca/doomsday.html)

~~~
tzs
Here's a probably faster/easier way for most people to compute the Doomsday
for a given year.

The Doomsday is the sum of a factor determined by the century part of the year
and a factor determined by year within the century.

The century factor is:

    
    
      Century  Factor
    
      20xx     2
      21xx     0
      22xx     5
      23xx     3
    

This pattern repeats every 4 centuries indefinitely forward, and however far
back you can go in your jurisdiction before you hit whatever calendar that was
used there before the Gregorian calendar. (If you want a formula for this, it
is 2 + (C % 4) x 5, where C is the first two digits of the year, but since
there are only 4 items in the pattern, and most people will actually only care
about one or two centuries, I'd just memorize the relevant factors).

For the factor determined by the year within the century, let T be the tens
digit of that year and U the ones digit.

If T is even, the factor is:

    
    
      2 x T + U + LE(U)
    

I'll cover LE below.

If T is odd, the factor is:

    
    
      2 x T + 3 + U + LO(U)
    

LO() and LE() are corrections to take into account leap years in years where U
!= 0. Leap years when U = 0 are already accounted for in the 2 x T. Here are
LE() and LO().

    
    
      LE(U) = 0 if U < 4
      LE(U) = 1 if 4 <= U < 8
      LE(U) = 2 if 8 <= U
    
      LO(U) = 0 if U < 2
      LO(U) = 1 if 2 <= U < 6
      LO(U) = 2 if 6 <= U
    

Or in English, in even decades add 1 if U >= 4, and add another 1 if U >= 8.
In odd decades, add 1 if U >= 2, and another 1 if U >= 6.

Example: 2020. Century 20 factor = 2, T=2, U=0. T is even. Doomsday is 2 + 2 x
2 + 0 + 0 = 6 (Saturday).

Here are the years used for some of the examples in the link you gave.

2019\. T=1, U=9. We've got an odd T, and a leap year correction of 2. Century
is still 20. That gives us 2 + 2 x 1 + 3 + 2 + 2 = 4 (Thursday). I've taken
the liberty of reducing mod 7 along the way, so used 2 instead of 9 when
adding in U. Note that when figuring the leap year factor you have to use the
actual U, not U mod 7.

2018\. 2 + 2 + 3 + 1 + 2 = 3 (Wednesday).

2017\. 2 + 2 + 3 + 0 + 2 = 2 (Tuesday).

2069\. 2 + 2 x 6 + 2 + 2 = 4 (Thursday).

1929\. 3 for 19xx. 3 + 2 x 2 + 2 + 2 = 4 (Thursday).

1999\. 3 + 2 x 2 + 3 + 2 + 2 = 0 (Sunday).

1982\. 3 + 2 x 1 + 2 = 0 (Sunday).

1969\. 3 + 2 x 6 + 2 + 2 = 5 (Friday).

2167\. 0 + 2 x 6 + 0 + 1 = 6 (Saturday).

~~~
kseistrup
I really like the “2053” pattern, it's easy to remember. But I doubt I will be
able to remember the rest. I think I'd rather do like this:

Given a year CCXX, we know the doomsday of year CC00 from the “2053“ rule, and
then:

    
    
        (a, b) = divmod(XX, 12)
        c = b // 4
        offset = a + b + c
    

Then add the offset to the day found by the “2053” rule, and you have the
doomsday of the year.

E.g., for 2020 we have:

    
    
        start = 2  # from the 2053 rule
        (a, b) = divmod(20, 12)  # (1, 8)
        c = 8 // 4  # 2
        offset = 1 + 8 + 2 = 4 (mod 7)
        doomsday = 2 + 4 = 6  # saturday

------
kryogen1c
how in the holy hell do you read this?

there are only 5 dates columns; how do you read days in month columns 6 and 7
(feb aug mar nov)?

am i suppossed to matrix multiply this thing or what. im not normally too dumb
for things but boy this is totally opaque to me.

~~~
timfrietas
I am guessing that people outside the US do not have as much trouble, as the
format is naturally dd/mm/yyyy instead of mm/dd/yy, so reading left to right
is more natural.

It took me a brief moment to acclimate to this, but after I did I felt it was
pretty straightforward and elegant.

~~~
roosgit
To me, this looks complicated as well. For a full year calendar I prefer a
standard one
[https://calendaroptions.com/2020-calendar/](https://calendaroptions.com/2020-calendar/).
If you're into space, NASA has a pretty cool science calendar(PDF)
[https://eospso.nasa.gov/sites/default/files/publications/202...](https://eospso.nasa.gov/sites/default/files/publications/2020%20NASA%20Science%20Calendar%20508%20final.pdf)

------
ai_ia
A feature addition: Clicking on a particular month, should select its column
and decrease the opacity of other months. Will increase readability.

~~~
captn3m0
Another suggestion: Keep the width of all dates equal, so that the first
column does not look weird.

------
intrepidhero
This is pretty clever and I admire the author for coming up with an elegant
way to show the mapping of week days to dates. I'd be particularly interested
to see the algorithm behind it. Date computations are very tricky.

A few years ago I made script to generate a one page calendar because the ones
they hand out at work are particularly ugly. In addition to showing the
date<->weekday mapping I also wanted it to show holidays and pay periods. This
is one of the (few) things stuck on my wall.

[https://intrepidhero.gitlab.io/mkcal/cal2020.html](https://intrepidhero.gitlab.io/mkcal/cal2020.html)

[https://gitlab.com/intrepidhero/mkcal](https://gitlab.com/intrepidhero/mkcal)

~~~
kohtatsu
Generate grid (it's static);

Find first weekday of month using your favourite algorithm;

Print month's name above the column that begins with that weekday.

~~~
intrepidhero
_favourite algorithm_ is left as an exercise to the reader. ;-)

~~~
zamadatix
Favorite algorithm can be as simple as "look at the first day of each month on
a normal calendar".

------
app4soft
Its not clear about such limitations as Feb <= 28/29 & Apr/Jun/Sep/Nov <= 30

~~~
jrockway
You can tell that 2020 is a leap year because if you look up the day of the
week for Feb. 28, it's Friday, and March 1st is a Sunday. That must mean that
Feb. 29th is a Saturday. And indeed it is.

------
joelanman
A few years back I took part in an online design challenge to make a pocket
calendar - it was a lot of fun, my designs are here:

[https://www.flickr.com/photos/joelanman/albums/7215759450272...](https://www.flickr.com/photos/joelanman/albums/72157594502722552/)

One of them is very similar to this one (Design 2) - I was tidying up someone
else's idea. Dunno if David Seah's was related in any way or just people came
up with the same idea.

~~~
barroomhero
Design 3 is quite nice. For me, it's the quickest to read.

~~~
alabut
Agreed. I love stacking the months like that and turning it into a never-
ending river of days, looks like it'd be easier to estimate the length of time
between two different months.

------
csallen
Where's the 21st?

~~~
mynegation
Probably copy paste error. There are two of 18.

~~~
teekert
How does one change the year then?

~~~
asdf21
First, you create the universe.

Then you build a new year of the calendar.

~~~
0xdeadbeefbabe
Then you argue.

------
7777fps
It's just wrong isn't it? It says Jan 20 is a Tuesday. It isn't.

~~~
bostonpete
Ha, yeah, there's two 18's and no 21

------
akavel
I'd guess the count of a particular month's days could be shown next to its
name as an aid? Esp. given that Feb tends to have it different in different
years
([https://en.wikipedia.org/wiki/Feb_29](https://en.wikipedia.org/wiki/Feb_29)).

Also, a somewhat related purely-mechanical idea I recently learnt of and
liked: [https://www.etsy.com/listing/570041707/desk-wood-eternal-
cal...](https://www.etsy.com/listing/570041707/desk-wood-eternal-calendar-
accessories)

------
sloucher
Good to know that Feb 31st falls on a Monday this year :-)

Love it though.

------
deanclatworthy
Can someone ELI5?

~~~
DHPersonal
It took me a while, but I think I have it: choose a month of the year in the
blue table and read only the column pertaining to that month. The column has
seven days within it and the first day in the column matches the first day of
that month; then, increment each day and date until reaching the maximum for
the month and proceed to the next month in its matching column. Never move
right to left in the blue month table as if moving through a standard
calendar's format; only loop through the column for the current month from top
to bottom.

------
QueensGambit
These upvotes prove that there is opportunity for products to be clever, but
not simple. For every windows like product, there is an opportunity for
command line tool.

~~~
crobertsbmw
Clever but not simple? I have a hard time believing that people want to
sacrifice simplicity for cleverness. But I see your point about people
preferring a CLI than a web portal. I guess simplicity is in the eye of the
beholder. What's simple for me, can often be wizardry for my dad.

~~~
dmos62
> simplicity is in the eye of the beholder

My example of this is git. I find it very complex, but it's clever, and very
useful.

~~~
QueensGambit
At the risk of facing the wrath of developers, they also choose products that
are not are not necessarily clever, but makes them clever. e.g: IaaS Vs PaaS,
C++ Vs Visual Basic etc.

Developers usually say that abstraction doesn't give them enough
control/flexibility. That might be true in some cases. But in most cases, they
are afraid that abstraction will make them dumb, instead of making them
clever.

------
litoE
Has anybody noticed that, starting tomorrow, the current day of the week, day
of the month and month will be highlighted, with the highlighting changing
correctly every day?

------
davmar
[https://www.youtube.com/watch?v=kY-
pUxKQMUE](https://www.youtube.com/watch?v=kY-pUxKQMUE)

------
grenoire
Not sure why, but it seems like the script which appends the 'today' class to
today's cell doesn't seem to be working.

~~~
underdeserver
Perhaps it's not 2020 yet.

------
pbamotra
Free - A 200-year calendar that is different from the rest.

[http://trackstar.4teachers.org/trackstar/ts/viewTrackMembers...](http://trackstar.4teachers.org/trackstar/ts/viewTrackMembersFramesMember.do?key=org.altec.trackstar.om.TrackMember;track_member_id\[180015\])

~~~
zamadatix
[https://upload.wikimedia.org/wikipedia/commons/7/74/Permanen...](https://upload.wikimedia.org/wikipedia/commons/7/74/Permanent_Calendar_gregorian.png)

------
OJFord
It took me stupidly long to work out how to read it, which I think was just
because days don't progress in the usual way, i.e. avoided if months were
swapped to the rows, and days read across.

Another improvement IMO would be to list e.g. 'June (30)', since at the moment
the #days in each month is lost to compression.

------
ChrisSD
What's cool about this representation is just how compact you could make it.
Forget a page, this could fit on a card in your pocket.

EDIT: A very quick (and rough) example:
[https://i.postimg.cc/nLrStmBt/micro.png](https://i.postimg.cc/nLrStmBt/micro.png)

------
IndrekR
The date 18 is double and 21 missing.

------
abhchand
Great concept. I would've prefered an option to switch the days of the week
and dates of the month. That way the numbers loop and the day of the week is
fixed as a row/column header. That's more similar to how we read usual wall
calendars.

------
cmstoken
Very cool, but missing 21st.

------
catchmeifyoucan
This is super cool. Since I usually read Month, Date, Year - would've been
awesome if the months/day was on the left. Took me a minute to read it - but
makes a lot of sense.

------
romdev
[http://sciral.com/free/year.html](http://sciral.com/free/year.html) has
worked for me for several years.

------
auslegung
That’s neat! Took me a few second to figure it out :)

~~~
rhizome31
Me too, the rollover on cells makes a bit confusing because it suggests
interactivity that is actually not there.

~~~
simonw
There's a rollover? That explains why I was puzzled that it didn't seem to
have any interactive elements: I'm on mobile.

------
yepthatsreality
\- Source code?

\- Is this generated using a known algorithm? Can the same trick be applied to
other years?

Very cool idea!

~~~
asdf21
It looks like it's currently manual, considering the double date on the 18th

~~~
wccrawford
It seems like it should be able to be done programmatically, though. It
suddenly seems like a neat project.

------
dbfa
Author here. Thanks for noticing the mistake! It's fixed now :)

Happy new year!

------
chewzerita
Just increment the 20, 19 and second 18 and it should be correct.

------
sys_64738
Why not simply do 'cal 2020' and embed it in HTML?

------
daw___
I'm not really sure what I am looking at.

EDIT: Now I am. Clever!

~~~
bobongo
I still am not. Could you explain?

~~~
laszlokorte
2d lookup table for (month,day) -> weekday

------
HocusLocus
With JS turned off the page is not blank!

What a miracle!

------
ekianjo
What happens with the two 18s?

------
thescribbblr
18 is double, 21 is missing

------
xwowsersx
Woah this is so clever!

------
blondin
this is super cool!!

