java.util.Date и getYear () - PullRequest
       4

java.util.Date и getYear ()

51 голосов
/ 11 февраля 2012

У меня возникла следующая проблема в Java (я вижу, что у некоторых людей похожая проблема в JavaScript, но я использую Java)

System.out.println(new Date().getYear());
System.out.println(new GregorianCalendar().getTime().getYear());
System.out.println(this.sale.getSaleDate().getYear());
System.out.println(this.sale.getSaleDate().getMonth());
System.out.println(this.sale.getSaleDate().getDate());

возвращает

I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 112
I/System.out( 4274): 1
I/System.out( 4274): 11

Iне понимаю 112 бит, который я думал, был бы 2012. Что происходит?Класс java.util.Date непригоден для использования?Я храню это как поле в нескольких моих классах для хранения даты и времени.Что мне делать?

Ответы [ 11 ]

61 голосов
/ 26 ноября 2015

В дополнение ко всем комментариям я подумал, что мог бы добавить код для использования java.util.Date, java.util.Calendar и java.util.GregorianCalendar в соответствии с javadoc .

//Initialize your Date however you like it.
Date date = new Date();
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
//Add one to month {0 - 11}
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
52 голосов
/ 12 февраля 2012

По данным javadocs:

@Deprecated
public int getYear()

Устаревшие . Начиная с версии 1.1 JDK, заменено на Calendar.get(Calendar.YEAR) - 1900.

Возвращает значение, которое является результатом вычитания 1900 из года, который содержит или начинается с момента времени, представленного этим объектом Date, как интерпретируется в местном часовом поясе.

Возвращает: год, представленный этой датой, минус 1900.

Смотрите также: Календарь

Так что 112 - правильный вывод. Я бы следовал совету в Javadoc или использовал бы вместо этого JodaTime.

31 голосов
/ 17 декабря 2013

Использовать формат даты

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(datetime);
SimpleDateFormat df = new SimpleDateFormat("yyyy");
year = df.format(date);
22 голосов
/ 05 сентября 2012

Не используйте Date, используйте Calendar:

// Beware: months are zero-based and no out of range errors are reported
Calendar date = new GregorianCalendar(2012, 9, 5);
int year = date.get(Calendar.YEAR);  // 2012
int month = date.get(Calendar.MONTH);  // 9 - October!!!
int day = date.get(Calendar.DAY_OF_MONTH);  // 5

Он также поддерживает время:

Calendar dateTime = new GregorianCalendar(2012, 3, 4, 15, 16, 17);
int hour = dateTime.get(Calendar.HOUR_OF_DAY);  // 15
int minute = dateTime.get(Calendar.MINUTE);  // 16
int second = dateTime.get(Calendar.SECOND);  // 17
10 голосов
/ 12 февраля 2012

Да, это на самом деле то, что происходит. См. Также Javadoc :

Returns:
   the year represented by this date, minus 1900.

По этой причине метод getYear устарел. Так что не используйте его.

Также обратите внимание, что getMonth возвращает число от 0 до 11. Поэтому this.sale.getSaleDate().getMonth() возвращает 1 для февраля вместо 2. Хотя java.util.Calendar не добавляет 1900 ко всем годам, оно страдает от побочных месячная проблема.

Вам гораздо лучше использовать JodaTime .

9 голосов
/ 19 февраля 2018

Java-документация предлагает использовать класс Calendar вместо этого устаревшего способа Вот пример кода для настройки объекта календаря

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());

Вот пример кода для получения года, месяца и т. Д.

System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));

Календарь также поддерживает много другой полезной информации, такой как, TIME, DAY_OF_MONTH и т. Д. Обратите внимание, что месяц основан на 0. Январь 0-го месяца.

7 голосов
/ 28 марта 2017

Класс Java 8 LocalDate - это еще один вариант получения года из java.util.Date,

int year = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date)).getYear();

Другой вариант,

int year = Integer.parseInt(new SimpleDateFormat("yyyy").format(date));
5 голосов
/ 09 июня 2016

ТЛ; др

LocalDate.now()       // Capture the date-only value current in the JVM’s current default time zone.
         .getYear()   // Extract the year number from that date.

2018

java.time

Оба класса java.util.Date и java.util.Calendar являются устаревшими, теперь их заменяет инфраструктура java.time, встроенная в Java 8 и более поздние версии.

Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция - это новый день, а еще «вчера» в Монреаль Квебек .

Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент, поэтому ваши результаты могут отличаться. Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.

Укажите собственное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 3-4-буквенное сокращение, например EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  

Если вам нужна только дата без времени суток, используйте LocalDate. В этом классе отсутствует информация о часовом поясе, но вы можете указать часовой пояс для определения текущей даты.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( zoneId );

Вы можете получить различную информацию с помощью getYear, getMonth и getDayOfMonth. Вы фактически получите номер года с java.time!

int year = localDate.getYear();

2016

Если вам нужна дата-время, а не просто дата, используйте ZonedDateTime class.

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;

О java.time

Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date, .Calendar и & java.text.SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений.

Большая часть функциональности java.time перенесена в Java 6 и Java 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как использовать… ).

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

1 голос
/ 27 февраля 2018

Year.now()

Существует более простой способ использования библиотеки java.time в Java 8+.Выражение:

java.time.Year.now().getValue()

возвращает текущий год в виде четырехзначного целого с использованием часового пояса по умолчанию.Есть много вариантов для различного времени ZoneId с, Календарь с и Часы с, но я думаю, что именно этого вы и захотите большую часть времени.Если вы хотите, чтобы код выглядел чище (и вам не нужны никакие другие функции java.time. *. Now ()), поместите:

import static java.time.Year.now;

вверху файла и вызовите:

now().getValue()

по мере необходимости.

1 голос
/ 12 февраля 2012

Это поведение описано в документации java.util.Date -класса:

Возвращает значение, являющееся результатом вычитания 1900 из года, в котором содержится или начинаетсяс моментом времени, представленным этим объектом Date, как интерпретируется в местном часовом поясе.

Он также помечается как устаревший.Вместо этого используйте java.util.Calendar .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...