Hacker News new | past | comments | ask | show | jobs | submit login
Show HN: One Page Calendar 2020 (davebakker.io)
517 points by dbfa on Dec 31, 2019 | hide | past | favorite | 98 comments



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/

(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)


Oh cool! I happened to build something similar a while back, because I was frustrated with the way that the Unix `cal` program laid out all the months in a 3 x 4 grid instead of in a continuous format:

https://github.com/jez/calz

So for example to get the same year-long calendar view as the Compact Calendar would have, I can type

    calz 2020
calz has a couple other features too which make it nicer to use than `cal`, but those are beside the point.


I have calz now. Thanks!

Now I just need a really long e-ink screen.


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...


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.


What do you mean “open source”? XLS is the (previously proprietary) format used by older versions that’s (basically) just serialized structs. XLSX (which I see here) is the ZIP/XML based version based on an open standard[0][1]. LibreOffice opens those just fine from my experience; It’s the older binary format that LibreOffice can screw up with formatting.

[0]: https://en.m.wikipedia.org/wiki/Office_Open_XML

[1]: ECMA-376, http://www.ecma-international.org/publications/standards/Ecm...


Perhaps things have gotten better, but OOXML is not an open format by the normal usage of the word (text based does not mean open). OOXML was rushed through the standardization process, and was entirely created by one vendor (Microsoft).

Microsoft doesn't even bother to support the OOXML format completely, as the Wikipedia article notes.


> OOXML is not an open format by the normal usage of the word

It's a poor standard (including, iirc, normative references to behavior of particular proprietary software), but it's standardized and free to use.


You are right although as I understood it, the MS standard is exceedingly complicated, some would say in an attempt to "obfuscate" it.

In any case, this specific excel template states that it requires Excel 2007 and might misbehave if using any other program such as OpenOffice or Google Sheets:

> Please note that Microsoft Excel 2007 or newer is required. Other software like Open Office, Google Docs, and Numbers may import the Excel spreadsheet, but due to differences in the way they handle dates you should double-check that the calendars are correct.


Thank goodness – you've brought up David Seah! I used to use his stationery religiously, but forgot his name. I appreciate it!


I print a bunch of these (sometimes multiple calendars on a page) and stick them up on the wall. Very useful to separate events / agendas of different classes on separate calendars e.g. birthdays, travel plans, project deadlines, appointments, goal tracking, habit tracking all go on different calendars but on the same wall.

Much cleaner than putting them all on the same calendar and fight for space.


I'm thinking of doing it on tracing paper so I can overlay one over the other to check for double booking.


not open source (and not the above calendar), but similar and useful if you're not on windows: https://docs.google.com/spreadsheets/u/2/d/1m1IWh6Mmli8K20Dd...

[+ attribution] Many thanks to Pedro Pablo Fuentes Schuster for this Google Sheets conversion! http://pedrofuent.es/


Nice, thanks!


It renders fine for me in Firefox, but garbled in Chrome. Disabling this CSS rule "fixes" the layout for me in Chrome, without breaking anything obvious in Firefox:

@media (min-width: 500px) .calendar td, .calendar th { max-width: 0; }

I'm not actually sure what benefit that rule provides in the first place, but I haven't done any serious CSS hacking in forever.


It certainly makes the year look a lot smaller than usual, when all the days are printed in 1/3 of a standard paper size.


not having the days of the week in close visual proximity to the dates makes utilizing this layout pretty tedious, imo.


Related: The Compact Calendar by David Seah

https://davidseah.com/node/compact-calendar/

I print this every year for almost a decade now!


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


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).


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


And in fact: Just knowing that the doomsday of 2020 is a saturday, I was able to construct the entire one page calendar with pen and paper in a couple of minutes.


You should submit that to HN.


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.


I'm guessing you locate your month on the top, then locate the day of the month and it tells you what day of the week it is.

It's an interesting design exercise, but I can't imagine people using this day to day.


My thought was "Your calendar is bad and you should feel bad." It's a reference and I don't actually mean that, except as a reaction to seeing it after clicking the title on HN which had me expecting something I might want to use.


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.


To me, this looks complicated as well. For a full year calendar I prefer a standard one 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...


Brit here. While this is undoubtedly clever, it confuses the hell out of me!


I think the idea is this:

1. On the left under "Dates" are the consecutive days of the month if you read column by column (of course not every month has 31 days).

2. The rows represent intervals of a week (hence each square is previous + 7).

3. Look first at the top left cell with June and Monday. That lines up with the days of the month 1, 8, 15, 22, 29. That's because those are all the Mondays of June.

4. Next row (same column) shows similar: The Tuesdays of June are 2, 9, 16, etc.

So you can start with any month (the columns) and look at the first row underneath to see which day of the week the month starts on and then follow the dates from there using the above logic.


The dates in a row correspond to the days beneath a month in the same row.

EG the 1st, 8th, 15th, 22nd, and 29th of January, April, and July all fall on Wednesday.

Or, May 18th is a Tuesday.


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


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


Another suggestion: add toggle option to rotate tables 90 degrees for conventional horizontal view.


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://gitlab.com/intrepidhero/mkcal


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.


favourite algorithm is left as an exercise to the reader. ;-)


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


Date computations like this are not at all tricky.


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


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.


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...

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.


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


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.


update - here's the original calendar design challenge:

http://www.elzr.com/blag/infodesign-challenge/


Where's the 21st?


Probably copy paste error. There are two of 18.


How does one change the year then?


First, you create the universe.

Then you build a new year of the calendar.


Then you argue.


Reuse one of the 18ths


I'd rather keep one of mine as a spare. I frequently find myself needing more time around the middle of the month.


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


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


May 20th is also not a Thursday.


There are two 18s, the 19 should instead say 20

...

old -> fixed

17 -> 17

18 -> 18

18 -> 19

19 -> 20

20 -> 21

...


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).

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


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

Love it though.


Can someone ELI5?


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.


Pick a month on the top, pick a day of the month on the left, find the day of the week in the row/column intersection.


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.


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.


> 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.


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.


I think that's a stretch. I like the calendar, but from what I can tell it's only useful for looking up the day of the week that a date falls on; shrinking it like this is similar to lossy compression.

With a moderate amount of practice you can also calculate a weekday given a date in your head! (Though I'd rather use this w)

https://plus.maths.org/content/what-day-week-were-you-born

So this is not exactly a "product"; people wouldn't fork over money for this. It's a neat design concept.

To add: CLIs aren't necessarily clever (I'd add rarely clever), and Windows-like products can often be far from simple. There are learning curves involved, but I think that's (mostly) a separate matter than simplicity/cleverness.

Again I think this calendar is cool, props to OP for thinking outside the box and making something for the new year~


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?



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


Perhaps it's not 2020 yet.


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

http://trackstar.4teachers.org/trackstar/ts/viewTrackMembers...



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.


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


The date 18 is double and 21 missing.


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.


Very cool, but missing 21st.


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.


http://sciral.com/free/year.html has worked for me for several years.


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


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


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


me too, I finally figure it out that one month only loop in one column.


- Source code?

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

Very cool idea!


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


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


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

Happy new year!


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


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


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

EDIT: Now I am. Clever!


I still am not. Could you explain?


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


To find the current day of the week, look at the row corresponding to the day of the month and the column corresponding to the month. There's a typo for the days 18-21 where there's two 18s.


With JS turned off the page is not blank!

What a miracle!


What happens with the two 18s?


18 is double, 21 is missing


Woah this is so clever!


this is super cool!!




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: