Нет, неjava.util.Date считается устаревшим, не относится к Java 8. Некоторые из его методов устарели, но не весь класс. Но вы должны избегать и того, и другого, поскольку они общеизвестно хлопотны, запутаны и несовершенны. Вместо этого используйте java.time (в Java 8) или Joda-Time . java.util.Datejava.util.Calendar
Василий Бурк
Ответы:
636
int year =Calendar.getInstance().get(Calendar.YEAR);
Не уверены, соответствует ли это критериям не создания нового Календаря? (Почему оппозиция так поступает?)
Увидев ваш ответ, Calendar будет хорошим объектом для использования. Я искал одну строчку, и я не думал, что Календарь будет иметь это для меня. Доказано, что я ошибаюсь! Спасибо!
karlgrz
Как насчет параллелизма, что если другой поток / фрагмент библиотеки изменяет текущее время? Не было бы разумно изменить его на что-то вроде: Calendar c = Calendar.getInstance (); synchronized (c) {c.setTimeInMillis (System.currentTimeMillis ()); return c.get (Calendar.YEAR);}
младший
1
Это возвращает различное значение в разных версиях Android. Я сравниваю Android v4.1.2 с v4.2.1.
toobsco42
2
@ycnix Нет проблем с параллелизмом в коде, поэтому нет необходимости делать его более скомпилированным. Calendar.getInstance().get(Calendar.YEAR) является атомарным в отношении внешнего изменения часов, и выполнение synchronized(c)нового экземпляра локальной переменной в любом случае было бы очень бессмысленным.
№
5
import java.util.Calendar
Доминикас Мостаускис
139
Использование времени API Java 8 (при условии , что вы счастливы , чтобы получить год в часовом поясе по умолчанию вашей системы), вы можете использовать в Year::nowметоде :
Я предлагаю всегда передавать необязательный ZoneIdаргумент, nowа не полагаться неявно на текущую зону по умолчанию JVM (которая может измениться в любой момент во время выполнения!).
Это возвращает различное значение в разных версиях Android. Я сравниваю Android v4.1.2 с v4.2.1.
toobsco42
1
@ toobsco42 - попробуйте поискать в поиске 'android calendar.year bug'
инструментарий
Эй, @toolkit, я провела какое-то исследование без удачи. Я надеялся на более конкретный ответ.
toobsco42
Я удалил свою SIM-карту из телефона с 4.1.2. Таким образом, сеть не смогла обновить дату и время на телефоне. Следовательно, телефон застрял в 2012 году. Похоже, что это не ошибка в 4.1.2.
toobsco42
14
Самый простой способ - получить год из Календаря.
// year is stored as a static memberint year =Calendar.getInstance().get(Calendar.YEAR);
Calendar.YEAR определяется таким образом ... public final static int YEAR = 1;
cagcowboy
2
API get () для Calendar получает данные, которые находятся в поле, указанном константой. Год находится в поле 1 в объекте Calendar! Calendar.getInstance () получает текущую дату. java.sun.com/j2se/1.4.2/docs/api/java/util/…
Боб Кинг,
Это возвращает различное значение в разных версиях Android. Я сравниваю Android v4.1.2 с v4.2.1.
toobsco42
Я удалил свою SIM-карту из телефона с 4.1.2. Таким образом, сеть не смогла обновить дату и время на телефоне. Следовательно, телефон застрял в 2012 году. Похоже, что это не ошибка в 4.1.2.
toobsco42
12
Вы также можете использовать 2 метода из java.time.YearMonth(начиная с Java 8):
import java.time.YearMonth;...int year =YearMonth.now().getYear();int month =YearMonth.now().getMonthValue();
Вы неправильно дублируете другой ответ, опубликованный давно. И вы производите месяц, который не имеет отношения к Вопросу. И вы игнорируете важнейшую проблему часового пояса. И ваше форматирование грязное. Я рад, что вы участвуете в переполнении стека. Но этот ответ недостаточно хорош. Отредактируйте, чтобы исправить свои слабые стороны и добавить больше значения, чем это уже предусмотрено другими Ответами. Или удалите свой ответ, прежде чем он соберет отрицательные голоса. PS Супер аватар значок!
Василий Бурк
Большое спасибо, мужчина. Я редактировал. ссылка немного другая, что у меня так
Журов Константин
10
Если вы хотите указать год для любого объекта даты, я использовал следующий метод:
publicstaticint getYearFromDate(Date date){int result =-1;if(date !=null){Calendar cal =Calendar.getInstance();
cal.setTime(date);
result = cal.get(Calendar.YEAR);}return result;}
Ответ на Раффи Хачатурян мудро показано , как использовать новый пакет java.time в Java 8. Но ответ не решает важный вопрос о временной зоне при определении даты.
int year = LocalDate.now (). getYear ();
Этот код зависит от текущего часового пояса JVM по умолчанию. Зона по умолчанию используется для определения сегодняшней даты. Помните, например, что в момент после полуночи в Париже дата в Монреале все еще «вчера».
Таким образом, ваши результаты могут отличаться в зависимости от того, на какой машине он работает, от пользователя / администратора, меняющего часовой пояс ОС хоста, или от любого кода Java в любой момент, меняющего текущее значение по умолчанию JVM. Лучше указать часовой пояс.
int year =ZonedDateTime.now(ZoneId.of("Africa/Casablanca")).getYear();
Joda времени
Некоторая идея, как указано выше, но с использованием библиотеки Joda-Time 2.7.
int year =DateTime.now(DateTimeZone.forID("Africa/Casablanca")).getYear();
Возрастающий / Убывающий Год
Если ваша цель - прыгать год за раз, нет необходимости извлекать номер года. И Joda-Time, и java.time имеют методы для добавления / вычитания года за раз. И эти методы разумны, они используют летнее время и другие аномалии.
@FBB Я предлагаю страницу Википедии для официального списка IANA названий часовых поясов. Осторожно: эти зоны меняются на удивление часто. Если вы действительно хотите , уточненный данные, загрузить новую копию в tzdataфайл данных самостоятельно. Вы можете просмотреть файл. И вы можете заменить устаревшие tzdata в вашей реализации Java. Oracle предоставляет инструмент обновления для их JVM.
Василий Бурк
4
Если ваше приложение интенсивно использует объекты Date и Calendar, вам действительно следует использовать Joda Time, потому что java.util.Dateоно изменчиво. java.util.Calendarимеет проблемы с производительностью, когда его поля обновляются, и неуклюжий для арифметики datetime.
@ AndrewT., Получите ThreeTen Backport, и он будет работать в Java 6 и 7 тоже.
Оле В.В.
3
Как некоторые люди ответили выше:
Если вы хотите использовать переменную позже, лучше используйте:
int year;
year =Calendar.getInstance().get(Calendar.YEAR);
Если вам нужен год только для состояния, лучше использовать:
Calendar.getInstance().get(Calendar.YEAR)
Например, если использовать его во время проверки, введенный год будет не меньше текущего года - 200 или больше текущего года (может быть годом рождения):
import java.util.Calendar;import java.util.Scanner;publicstaticvoid main (String[] args){Scanner scannernumber =newScanner(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));}
Этот метод устарел. И этот ужасный класс был вытеснен несколько лет назад классами java.time, определенными в JSR 310. См. Современное решение в Ответе от assylias .
Василий Бурк
да, но я активно искал решение и перепробовал множество доступных решений, и для меня это сработало, поэтому я написал :)
Mayur Satav
-1
В Java версии 8+ можно (рекомендуется) использовать библиотеку java.time . ISO 8601 устанавливает стандартный способ записи дат: YYYY-MM-DDи java.time.Instantиспользует его, поэтому (для UTC):
java.util.Date
считается устаревшим, не относится к Java 8. Некоторые из его методов устарели, но не весь класс. Но вы должны избегать и того, и другого, поскольку они общеизвестно хлопотны, запутаны и несовершенны. Вместо этого используйте java.time (в Java 8) или Joda-Time .java.util.Date
java.util.Calendar
Ответы:
Не уверены, соответствует ли это критериям не создания нового Календаря? (Почему оппозиция так поступает?)
источник
Calendar.getInstance().get(Calendar.YEAR)
является атомарным в отношении внешнего изменения часов, и выполнениеsynchronized(c)
нового экземпляра локальной переменной в любом случае было бы очень бессмысленным.import java.util.Calendar
Использование времени API Java 8 (при условии , что вы счастливы , чтобы получить год в часовом поясе по умолчанию вашей системы), вы можете использовать в
Year::now
методе :источник
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--Это самое простое (с использованием Календаря, извините):
Также есть новый API даты и времени JSR , а также Joda Time
источник
Самый простой способ - получить год из Календаря.
источник
Вы также можете использовать 2 метода из
java.time.YearMonth
(начиная с Java 8):источник
Если вы хотите указать год для любого объекта даты, я использовал следующий метод:
источник
ТЛ; др
Часовой пояс
Ответ на Раффи Хачатурян мудро показано , как использовать новый пакет java.time в Java 8. Но ответ не решает важный вопрос о временной зоне при определении даты.
Этот код зависит от текущего часового пояса JVM по умолчанию. Зона по умолчанию используется для определения сегодняшней даты. Помните, например, что в момент после полуночи в Париже дата в Монреале все еще «вчера».
Таким образом, ваши результаты могут отличаться в зависимости от того, на какой машине он работает, от пользователя / администратора, меняющего часовой пояс ОС хоста, или от любого кода Java в любой момент, меняющего текущее значение по умолчанию JVM. Лучше указать часовой пояс.
Кстати, всегда использовать собственные имена часовых поясов , как определяемые IANA . Никогда не используйте 3-4-буквенные коды, которые не являются ни стандартизированными, ни уникальными.
java.time
Пример в java.time Java 8.
Joda времени
Некоторая идея, как указано выше, но с использованием библиотеки Joda-Time 2.7.
Возрастающий / Убывающий Год
Если ваша цель - прыгать год за раз, нет необходимости извлекать номер года. И Joda-Time, и java.time имеют методы для добавления / вычитания года за раз. И эти методы разумны, они используют летнее время и другие аномалии.
Пример в java.time .
Пример в Joda-Time 2.7.
источник
tzdata
файл данных самостоятельно. Вы можете просмотреть файл. И вы можете заменить устаревшие tzdata в вашей реализации Java. Oracle предоставляет инструмент обновления для их JVM.Если ваше приложение интенсивно использует объекты Date и Calendar, вам действительно следует использовать Joda Time, потому что
java.util.Date
оно изменчиво.java.util.Calendar
имеет проблемы с производительностью, когда его поля обновляются, и неуклюжий для арифметики datetime.источник
Вы также можете использовать Java 8
LocalDate
:источник
Как некоторые люди ответили выше:
Если вы хотите использовать переменную позже, лучше используйте:
Если вам нужен год только для состояния, лучше использовать:
Например, если использовать его во время проверки, введенный год будет не меньше текущего года - 200 или больше текущего года (может быть годом рождения):
источник
Используйте следующий код для Java 8:
источник
В моем случае ничего из вышеперечисленного не сработало. Поэтому, попробовав много решений, я нашел ниже одного, и это сработало для меня
источник
В Java версии 8+ можно (рекомендуется) использовать библиотеку java.time . ISO 8601 устанавливает стандартный способ записи дат:
YYYY-MM-DD
иjava.time.Instant
использует его, поэтому (дляUTC
):PS на всякий случай (и замкнут для получения
String
, нетint
), использованиеCalendar
выглядит лучше и может быть сделано с учетом зоны.источник
Вы можете сделать все это с помощью математики Integer без необходимости создания экземпляра календаря:
Может быть, на один или два часа на новый год, но у меня нет впечатления, что это проблема?
источник
Я использую специальные функции в моей библиотеке для работы с днями / месяцами / годами -
источник