Відповіді:
int year = Calendar.getInstance().get(Calendar.YEAR);
Не впевнені, чи відповідає це критеріям невстановлення нового календаря? (Чому опозиція це робить?)
Calendar.getInstance().get(Calendar.YEAR)
є атомним щодо того, що годинник змінюється зовні, і робити synchronized(c)
на новому екземплярі локальну змінну як би там не було дуже безглуздо.
import java.util.Calendar
Використання часу API Java 8 (за умови , що ви щасливі , щоб отримати рік в часовому поясі по замовчуванням вашої системи), ви можете використовувати в Year::now
методі :
int year = Year.now().getValue();
ZoneId
аргумент, now
а не неявно покладатися на поточну зону за замовчуванням JVM (це може змінитися в будь-який момент під час виконання!).
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
Найпростіший (за допомогою календаря, вибачте):
int year = Calendar.getInstance().get(Calendar.YEAR);
Також є новий JSR API API дати та часу , а також Joda Time
Найпростіший спосіб - це отримати рік з календаря.
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
Ви також можете скористатися двома методами з java.time.YearMonth
(Так як Java 8):
import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
Якщо ви хочете рік будь-якого об’єкта дати, я застосував такий метод:
public static int getYearFromDate(Date date) {
int result = -1;
if (date != null) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
result = cal.get(Calendar.YEAR);
}
return result;
}
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
Відповідь на Раффі Хачатурян мудро показано , як використовувати новий пакет java.time в Java 8. Але відповідь не вирішує важливе питання про тимчасову зоні при визначенні дати.
int рік = LocalDate.now (). getYear ();
Цей код залежить від поточного часового поясу за замовчуванням JVM. Зона за замовчуванням використовується для визначення того, яка сьогоднішня дата. Пригадайте, наприклад, що в Парижі в моменті після півночі дата в Монреалі все ще є "вчорашньою".
Таким чином, ваші результати можуть відрізнятися залежно від того, на якій машині він працює, користувач / адміністратор, що змінює часовий пояс хост-операційної системи, або будь-який код Java в будь-який момент, змінюючи поточний за замовчуванням JVM. Краще вказати часовий пояс.
До речі, завжди використовуйте належні назви часових поясів, як визначено IANA . Ніколи не використовуйте 3-4 буквених кодів, які не є ні стандартизованими, ні унікальними.
Приклад у java.time Java 8.
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
Деяка ідея, як описано вище, але за допомогою бібліотеки Joda-Time 2.7.
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
Якщо ваша мета - стрибати рік за один раз, не потрібно витягувати номер року. І Joda-Time, і java.time мають методи додавання / віднімання року за один раз. І ці методи розумні, поводження з літним часом та іншими аномаліями.
Приклад у Joda-Time 2.7.
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
tzdata
файл даних самостійно. Ви можете ознайомитись з файлом. І ви можете замінити застарілу tzdata у своїй реалізації Java. Oracle надає інструмент оновлення для свого JVM.
Ви також можете використовувати Java 8 LocalDate
:
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
Як відповіли деякі люди вище:
Якщо ви хочете використовувати змінну пізніше, краще скористайтеся:
int year;
year = Calendar.getInstance().get(Calendar.YEAR);
Якщо вам потрібен рік лише для умови, то краще скористайтеся:
Calendar.getInstance().get(Calendar.YEAR)
Наприклад, використовуючи його у виконанні, в той час як введений рік перевірок не менше поточного року-200 або більше, ніж поточний рік (Можливо, рік народження):
import java.util.Calendar;
import java.util.Scanner;
public static void main (String[] args){
Scanner scannernumber = new Scanner(System.in);
int year;
/*Checks that the year is not higher than the current year, and not less than the current year - 200 years.*/
do{
System.out.print("Year (Between "+((Calendar.getInstance().get(Calendar.YEAR))-200)+" and "+Calendar.getInstance().get(Calendar.YEAR)+") : ");
year = scannernumber.nextInt();
}while(year < ((Calendar.getInstance().get(Calendar.YEAR))-200) || year > Calendar.getInstance().get(Calendar.YEAR));
}
У моєму випадку нічого із зазначеного не працює. Отже, спробувавши багато рішень, я знайшов нижче одного, і він працював на мене
import java.util.Scanner;
import java.util.Date;
public class Practice
{
public static void main(String[] args)
{
Date d=new Date();
int year=d.getYear();
int currentYear=year+1900;
System.out.println(currentYear);
}
}
У версії Java 8+ можна (рекомендується) використовувати бібліотеку java.time . ISO 8601 встановлює стандартний спосіб запису дат: YYYY-MM-DD
і java.time.Instant
використовує його, так (для UTC
):
import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));
PS на всякий випадок (і за короткий час, щоб отримати String
, ні int
), використання Calendar
виглядає краще і може бути зрозуміло зоні.
Ви можете зробити все, використовуючи математику Integer, не потребуючи примірника календаря:
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
Можливо, новий рік буде відключений на годину чи дві, але я не відчуваю, що це проблема?
Я використовую спеціальні функції в моїй бібліотеці для роботи з датами / місяцем / роком -
int[] int_dmy( long timestamp ) // remember month is [0..11] !!!
{
Calendar cal = new GregorianCalendar(); cal.setTimeInMillis( timestamp );
return new int[] {
cal.get( Calendar.DATE ), cal.get( Calendar.MONTH ), cal.get( Calendar.YEAR )
};
};
int[] int_dmy( Date d ) {
...
}
java.util.Date
це НЕ рекомендується, а не з Java 8. Деякі з методів є застарілими , але не весь клас. Але ви повинні уникати якjava.util.Date
іjava.util.Calendar
вони , як відомо , клопітка, заплутані, і недоліки. Замість цього використовуйте або java.time (на Java 8), або Joda-Time .