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

Modern Date/Time APIs on Android

Modern Date/Time APIs on Android

Droidcon Bucharest 2016

Alex Florescu

March 12, 2016
Tweet

More Decks by Alex Florescu

Other Decks in Programming

Transcript

  1. Modern Date/Time
    APIs on Android
    Droidcon Bucharest 2016
    Alex Florescu
    @flor3scu
    YPlan

    View Slide

  2. Overview
    • Why
    • Joda time and JSR-310
    • What can you do with them
    • Setup & testing
    • Good and bad

    View Slide

  3. Date and Time is hard
    • Timezones
    • Daylight savings
    • Different calendar systems
    • Leap days/seconds/etc
    • AND MORE

    View Slide

  4. Quiz: Leap years
    • A leap year (e.g. 2016) adds a day, February 29th
    • What years are leap years?

    View Slide

  5. Quiz: What is a leap year?
    • Divisible by four

    View Slide

  6. Quiz: What is a leap year?
    • Divisible by four
    • But NOT divisible by 100

    View Slide

  7. Quiz: What is a leap year?
    • Divisible by four
    • But NOT divisible by 100
    • UNLESS divisible by 400

    View Slide

  8. What’s wrong with Java 6
    Date?

    View Slide

  9. java.util.Date
    Date someDate = new Date(1967, 5, 10);

    System.out.println(someDate);
    // What date is this?
    May 10th 1967

    June 11th 1967

    October 5th 1967

    November 6th 1967

    View Slide

  10. java.util.Date
    Date someDate = new Date(1967, 5, 10);

    System.out.println(someDate);
    Answer: June 10th 3867
    Year: years from 1900

    Month: 0-indexed

    Day: 1-indexed

    View Slide

  11. Java 6 Date/Time API
    • Mutable
    • 0-indexed months
    • Little support for simple operations
    • No representation for duration, non-time-zone
    dates, only dates, only times etc.

    View Slide

  12. JVM Alternatives
    • Joda Time
    • Since 2004
    • De-facto date/time solution pre-Java 8
    • JSR-310 / Java 8 API
    • Released in 2014
    • Same project lead as Joda Time
    • Official API for Java 8, backported to Java 6

    View Slide

  13. Joda time
    • Still actively maintained
    • For new projects use Java 8 API
    • See comparison and Stephen Colebourne’s blog

    View Slide

  14. Joda time on Android
    • Can use directly, but large memory footprint
    • See problem description
    • Solution: https://github.com/dlew/joda-time-android
    • Method count: 5053

    View Slide

  15. JSR-310 / Java 8 API
    • Official JVM solution (>= Java 8)
    • Built with experience from Joda time
    • Generally better performance
    • Smaller package, fewer methods

    View Slide

  16. ThreeTen on Android
    • Backport library “ThreeTen”, Java 6 compatible
    • Same problem as Joda if use JVM lib directly
    • Use: https://github.com/JakeWharton/ThreeTenABP
    • Method count: 3278

    View Slide

  17. Setup
    • In build.gradle:
    compile
    'com.jakewharton.threetenabp:threetenabp:1.0.3'
    • In Application.onCreate():
    @Override public void onCreate() {
    super.onCreate();
    AndroidThreeTen.init(this);
    }

    View Slide

  18. Cool things
    ZonedDateTime.now();
    //2016-03-12T12:11:25.371+02:00

    [Europe/Bucharest]
    ZonedDateTime.now(ZoneId.of("Europe/
    London")); 

    //2016-03-12T10:11:26.374+00:00

    [Europe/London]

    View Slide

  19. Cool things
    LocalDateTime now = LocalDateTime.now();
    LocalDate tomorrowDay =
    now.toLocalDate().plusDays(1);
    LocalDateTime noonTomorrow =
    tomorrowDay.atTime(12, 0);

    View Slide

  20. Cool things
    LocalTime now = LocalTime.now();
    LocalTime lunchTime = 

    LocalTime.of(12, 30);

    if (now.isAfter(lunchTime)) {

    // GO TO LUNCH

    }

    View Slide

  21. Testing
    • UI tests — just test the app
    • Robolectric tests — initialise with Robo context
    • Plain JUnit tests — use JVM back port

    testCompile 'org.threeten:threetenbp:
    1.3.1'

    View Slide

  22. Testing
    • Note: Can’t mix Robolectric and plain JUnit tests
    • Separate plain JUnit and Robolectric tests
    • If using ThreeTenABP in a module/configuration, all
    tests (that involve ThreeTen) must be Robolectric

    View Slide

  23. Why should you use?
    • Safer, clearer, fluent API
    • Easier to do everything
    • Immutable
    • Excellent timezone support

    View Slide

  24. Any negatives?
    • Immutable (Android GC’ing is not JVM GC’ing)
    • 5% towards DEX limit
    • Need to connect old and new APIs
    • Android specific locale issues (e.g. 24-hr toggle)

    View Slide

  25. More docs
    • ThreeTen Reference
    • JavaDoc

    View Slide

  26. Thank you
    • Slides: http://bit.do/AlexDroidconRo
    • T: @flor3scu

    View Slide