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. Overview • Why • Joda time and JSR-310 • What

    can you do with them • Setup & testing • Good and bad
  2. Date and Time is hard • Timezones • Daylight savings

    • Different calendar systems • Leap days/seconds/etc • AND MORE
  3. Quiz: Leap years • A leap year (e.g. 2016) adds

    a day, February 29th • What years are leap years?
  4. Quiz: What is a leap year? • Divisible by four

    • But NOT divisible by 100 • UNLESS divisible by 400
  5. 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
  6. 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
  7. 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.
  8. 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
  9. Joda time • Still actively maintained • For new projects

    use Java 8 API • See comparison and Stephen Colebourne’s blog
  10. 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
  11. JSR-310 / Java 8 API • Official JVM solution (>=

    Java 8) • Built with experience from Joda time • Generally better performance • Smaller package, fewer methods
  12. 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
  13. Cool things LocalTime now = LocalTime.now(); LocalTime lunchTime = 


    LocalTime.of(12, 30); 
 if (now.isAfter(lunchTime)) {
 // GO TO LUNCH
 }
  14. 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'
  15. 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
  16. Why should you use? • Safer, clearer, fluent API •

    Easier to do everything • Immutable • Excellent timezone support
  17. 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)