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
класс непригодным для использования? Я храню это как поле в нескольких
моих классов для хранения даты и времени. Что мне делать?
Ответы
Ответ 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){
}
Большая часть даты устарела.