Ответы:
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);
Также есть новый API даты и времени JSR , а также Joda Time
Самый простой способ - получить год из Календаря.
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
Вы также можете использовать 2 метода из 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 year = 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 имеют методы для добавления / вычитания года за раз. И эти методы разумны, они используют летнее время и другие аномалии.
Пример в java.time .
ZonedDateTime zdt =
ZonedDateTime
.now( ZoneId.of( "Africa/Casablanca" ) )
.minusYears( 1 )
;
Пример в 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.time (в Java 8) или Joda-Time .java.util.Date
java.util.Calendar