Подтвердить что ты не робот

Java.util.Date и getYear()

У меня возникает следующая проблема в 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

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

4b9b3361

Ответ 1

Согласно javadocs:

@Deprecated
public int getYear()

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

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

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

См. также: Calendar

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

Ответ 2

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

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(datetime);
SimpleDateFormat df = new SimpleDateFormat("yyyy");
year = df.format(date);

Ответ 3

В дополнение ко всем комментариям, я думал, что могу добавить код о том, как использовать 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);

Ответ 4

Не используйте 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

Ответ 5

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

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

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

Обратите внимание также, что getMonth возвращает число от 0 до 11. Следовательно, this.sale.getSaleDate().getMonth() возвращает 1 для февраля, а не 2. Пока java.util.Calendar не добавляет 1900 к годам, он страдает от off-by -немесячная проблема.

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

Ответ 6

java.time

Оба класса java.util.Date и java.util.Calendar являются устаревшими, теперь вытесняются инфраструктурой java.time, встроенной в Java 8 и более поздние версии. Большая часть функциональности java.time была перенесена на Java 6 и 7, а также адаптирована для Android.

Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата может изменяться по всему миру по часовому поясу.

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

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

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

int year = localDate.getYear();

2016

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

Ответ 7

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

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

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

Ответ 8

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));

Ответ 9

        try{ 
int year = Integer.parseInt(new Date().toString().split("-")[0]); 
} 
catch(NumberFormatException e){
}

Большая часть даты устарела.