Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Time is Hard

Time is Hard

A look at why it's such a pain to deal with Date/Time in code, and some interesting corner cases. Given at IPRUG.

Chris Sinjakli

June 04, 2013
Tweet

More Decks by Chris Sinjakli

Other Decks in Programming

Transcript

  1. Time is
    Hard
    @ChrisSinjo
    IPRUG – 4th June 2013

    View Slide

  2. What’s so
    interesting?

    View Slide

  3. Subtlety

    View Slide

  4. Time.now is easy

    View Slide

  5. Time.now is easy
    (We’ll see about this)

    View Slide

  6. Most apps care
    (Conjecture)

    View Slide

  7. We won’t cover…
    Inconsistent servers
    Unreliable clocks
    Clocks in space

    View Slide

  8. So what can go
    wrong?

    View Slide

  9. Server timezone

    View Slide

  10. [email protected]:~$ irb
    > Time.now
    => 2013-05-22 22:10:53 +0100
    [email protected]:~$ irb
    > Time.now
    => 2013-05-22 21:11:07 +0000

    View Slide

  11. [email protected]:~$ irb
    > Time.now
    => 2013-05-22 22:10:53 +0100
    [email protected]:~$ TZ=UTC irb
    > Time.now
    => 2013-05-22 21:11:07 +0000

    View Slide

  12. Time.now is easy

    View Slide

  13. Time.now.utc is easier

    View Slide

  14. User timezone
    (browser)

    View Slide

  15. var offset = new Date().getTimezoneOffset();
    offset = -offset;
    var time = moment("2010-10-20 14:30 +0000",
    "YYYY-MM-DD HH:mm Z");
    var localTime = time.add("minutes", offset);

    View Slide

  16. var offset = new Date().getTimezoneOffset();
    offset = -offset;
    var time = moment("2010-10-20 14:30 +0000",
    "YYYY-MM-DD HH:mm Z");
    var localTime = time.add("minutes", offset);
    Changes with DST

    View Slide

  17. Trust the
    user’s machine?

    View Slide

  18. DST

    View Slide

  19. HTTP Logs
    [27/Oct/2013:01:30:00] "GET /some/page"
    [27/Oct/2013:01:59:00] "GET /another/page"
    [27/Oct/2013:01:30:00] "GET /some/page"

    View Slide

  20. HTTP Logs
    [27/Oct/2013:01:30:00 +0100] "GET /some/page"
    [27/Oct/2013:01:59:00 +0100] "GET /another/page"
    [27/Oct/2013:01:30:00 +0000] "GET /some/page"

    View Slide

  21. HTTP Logs
    [27/Oct/2013:01:30:00 +0100] "GET /some/page"
    [27/Oct/2013:01:59:00 +0100] "GET /another/page"
    [27/Oct/2013:01:30:00 +0000] "GET /some/page"
    [27/Oct/2013:00:30:00 +0000] "GET /some/page"
    [27/Oct/2013:00:59:00 +0000] "GET /another/page"
    [27/Oct/2013:01:30:00 +0000] "GET /some/page"

    View Slide

  22. Changes to DST

    View Slide

  23. 2011: Russia
    abandons
    DST

    View Slide

  24. Timezone hopping

    View Slide

  25. 2011: Samoa
    skips a day

    View Slide

  26. Offsets are not timezones
    Tip:

    View Slide

  27. Offset: +0000
    Zone: "Europe/London"

    View Slide

  28. SQL doesn’t
    get this

    View Slide

  29. So how do we
    get it right?

    View Slide

  30. UTC everywhere

    View Slide

  31. Localise late

    View Slide

  32. Use the
    libraries

    View Slide

  33. Trust IANA
    data

    View Slide

  34. Some fun

    View Slide

  35. Days that
    aren’t

    View Slide

  36. 1752: England
    11 days gone

    View Slide

  37. 1752: England
    A 9 month year

    View Slide

  38. Leap seconds

    View Slide

  39. 86,400
    seconds in a day

    View Slide

  40. 86,400 86,401
    seconds in a day

    View Slide

  41. 2012: Everywhere
    The end of
    the world

    View Slide

  42. 2012: Everywhere
    The end of
    the world

    View Slide

  43. 2012: Everywhere
    Leap-second
    kernel bug

    View Slide

  44. 2012: Everywhere
    Leap-second
    kernel bug

    View Slide

  45. 2012: Everywhere but
    Google
    Leap-second
    kernel bug

    View Slide

  46. But I digress…
    (Where were we?)

    View Slide

  47. The main things
    UTC rocks
    IANA tzdata rocks
    You need to think

    View Slide

  48. Questions?
    @ChrisSinjo

    View Slide