Convert a date to xkcd notation
JavaScript (ES6), 168 173

As an anonymous function. Using template strings, there is a newline near the end that is significant and included in the byte count.

d=&gt;d.replace(/\d/g,c=&gt;m=(l=((o[c]=o[c]||[b,c,b])[p/2&amp;~1]+=++p).length)&gt;m?l:m,t=[m=p=b='',b,b],o=[])&amp;o.map(x=&gt;x&amp;&amp;x.map((x,i)=&gt;t[i]+=(x+'     ').slice(0,m+1)))||t.join`
`


Less golfed

f=d=&gt;(
  // get the indices in o and the columns width in m
  m=0,
  p=0,
  o=[],
  d.replace(/\d/g,c=&gt;(
    o[c] = o[c]||['',c,''], // for each found digit :array with top indices, digit, bottom indices
    o[c][p/2 &amp; ~1] += ++p, // (p/2 and not 1) maps 0..3 to 0, 4..7 to 2
    l = o[c].length,
    m = l&gt;m ? l : m // max indices string length in m 
  )),
  // build the output in t
  t=['','',''],
  o.map(x=&gt; x &amp;&amp; x.map(
    (x,i) =&gt; t[i]+=(x+'     ').slice(0,m+1)) // left justify, max value of m is 4
  ),
  t.join`\n` // return output as a newline separated string
)   


Test snippet



f=d=&gt;
  d.replace(/\d/g,c=&gt;m=(l=((o[c]=o[c]||[b,c,b])[p/2&amp;~1]+=++p).length)&gt;m?l:m,t=[m=p=b='',b,b],o=[])&amp;
  o.map(x=&gt;x&amp;&amp;x.map((x,i)=&gt;t[i]+=(x+'     ').slice(0,m+1)))
  ||t.join`\n`


console.log=x=&gt;O.textContent+=x+'\n'

;['2013-02-27','2015-12-24','2222-11-11','1878-02-08','2061-02-22','3564-10-28','1111-11-11']
.forEach(t=&gt;console.log(t+'\n'+f(t)+'\n'))
&lt;pre id=O&gt;&lt;/pre&gt;