How to get current year in android?

I tried

int year = Calendar.get(Calendar.YEAR);

but it is giving me compile time error that

Non-static method 'get(int)' cannot be referenced from a static context.

I am calling this method from call method of observable.

Observable.combineLatest(ob1 ob2,
                ob3, new Func3<String, String, String, Boolean>() {
                    @Override
                    public Boolean call(String a, String b, String c) {...

I had also seen (new Date()).getYear(); but it is deprecated.


Solution 1:

Because you need to create an instance first.

try this

Calendar.getInstance().get(Calendar.YEAR);

and you are good to go.

Solution 2:

Yeah, you get an error because this is not a static method. First you need to create an instance of the Calendar class.
i.e.

Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);

If your min API version is <26, you can do a shorthand as well:

val yearInt = Year.now().value

Solution 3:

#tl;dr

Year.now()
    .getValue()

java.time

The other Answers use the troublesome old date-time classes such as Calendar. These are supplanted by the java.time classes. For older versions of Android, see the ThreeTen-Backport and ThreeTenABP projects.

Year class

Rather than pass around mere integers to represent a year, pass around objects. Namely, the Year class.

Getting the current year requires a time zone. For any given moment, the date varies around the globe by zone. So it is possible for Pacific/Auckland to be on 2018 while America/Montreal is in 2017 simultaneously.

Better to pass explicitly the desired/expected zone. If omitted, you implicitly get the JVM’s current default time zone. That default can change at any moment during runtime, so it is not reliable.

ZoneId z = ZoneId.now( "Asia/Kolkata" ) ;
Year y = Year.now( z ) ;

When you do need an integer, extract the value.

int yearNumber = y.getValue() ;

About java.time

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?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11, and later - Part of the standard Java API with a bundled implementation.
    • Java 9 brought some minor features and fixes.
  • Java SE 6 and Java SE 7
    • Most of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
  • Android
    • Later versions of Android (26+) bundle implementations of the java.time classes.
    • For earlier Android (<26), the process of API desugaring brings a subset of the java.time functionality not originally built into Android.
      • If the desugaring does not offer what you need, the ThreeTenABP project adapts ThreeTen-Backport (mentioned above) to Android. See How to use ThreeTenABP….

Solution 4:

// get current year、month and day
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DATE);

// get current year millis
Time time = new Time(Time.TIMEZONE_UTC);
calendar.set(year, 0, 0, 0, 0, 0);
long year = calendar.getTimeInMillis();
time.set(year);
year = time.toMillis(true);

Solution 5:

you should use

Calendar.getInstance().get(Calendar.YEAR);