I'm new to Android and I'm trying to get the current date but the Android Calendar
class requires API 24. I need to support older device and the Time
class is deprecated since API 22.
The problem is how to get current date on API 23 and I solved it by using java.util.Calendar
which works on all versions. So what should I use, Android calendar or Java calendar?
Note that day, month and year are just integers when using the Android calendar.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
day =android.icu.util.Calendar.getInstance().get(android.icu.util.Calendar.DAY_OF_MONTH);
month = android.icu.util.Calendar.getInstance().get(android.icu.util.Calendar.MONTH);
year = android.icu.util.Calendar.getInstance().get(android.icu.util.Calendar.YEAR);
}
else {
day = java.util.Calendar.getInstance().get(java.util.Calendar.DAY_OF_MONTH);
month = java.util.Calendar.getInstance().get(java.util.Calendar.MONTH);
year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
}
And when using only Java calendar there's no need to check the API version
day = java.util.Calendar.getInstance().get(java.util.Calendar.DAY_OF_MONTH);
month = java.util.Calendar.getInstance().get(java.util.Calendar.MONTH);
year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
So what should I use, Android calendar or Java calendar?
Neither.
Use the modern java.time classes. Available in all Android versions via Gradle Plugin 4.
LocalDate.of( 2018 , Month.JANUARY , 23 )
In Java, the terrible java.util.Calendar
class (and related classes, Date
etc.) was supplanted years ago by the java.time classes. Now available in Android 26 and later.
The ThreeTen-Backport library bring must of the java.time functionality to Java 6 & 7 using virtually identical API. That project is further adapted for Android <26 in the ThreeTenABP project.
I strongly recommend avoiding the legacy classes, instead using only the java.time classes. These modern classes are defined in JSR 310, and led by the same man who led the industry-leading Joda-Time library, Stephen Colebourne. So they have excellent design based on many years of experience. Using ThreeTenABP is well worth the bother of adding the library to your project.
For a date-only, year-month-day, without a time-of-day and without a time zone, use the LocalDate
class.
LocalDate ld = LocalDate.of( 2018 , 1 , 23 ) ;
Or use the handy Month
enum for more readability.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date
, Calendar
, & SimpleDateFormat
.
To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for java.sql.*
classes. Hibernate 5 & JPA 2.2 support java.time.
Where to obtain the java.time classes?