The old Java classes for handling dates and times are terrible.
SimpleDateFormat, etc., are badly designed, buggy, and very difficult to use for anything other than the most basic date/time handling.
If your minimum Android sdk is 26 (Oreo) then you can use the newer Java 8 date/time classes instead of these old problematic classes, which can save a whole load of time and potential bugs. But not many projects have the luxury of targeting 26 and above; on my latest app I thought I was being aggressive by setting the minimum sdk to 24 (Nougat), and on most client projects I work on the minimum is less than this.
Until recently I have been using the most excellent ThreeTen Android Backport, which does a very good job of providing most of the functionality that the Java 8 classes provide. But since Android Gradle plugin 4.0 there comes a new, even better option:
Core library desugaring
Core library what? That’s what I thought anyway. Basically it means you can use some of the Java 8 features on any version of Android, as described here.
And crucially this includes most of the Java 8
java.time classes, which make it so much easier to handle date and time functions like timezones, date and time span calculations, and date time formatting in a thread-safe way.
To use these classes you have to use the Android Gradle plugin version 4.0+. This is set in you project level
Then in your module level
build.gradle file you need to set the Java version to 1.8, and set
coreLibraryDesugaringEnabled to true. I also have the Kotlin options set to Java 8, not sure if this is needed for this but it seems like a sensible setting anyway:
jvmTarget = '1.8'
Finally in the same module level
build.gradle file add the dependency for the desugaring library:
And that’s it. Proper date and time functionality in any Android app. Take a look at this for an introduction to the APIs.