Почему Java Date.getYear () возвращает 111 вместо 2011? - PullRequest
42 голосов
/ 27 августа 2011

У меня возникли проблемы с анализом строковой даты для объекта Date.Я использую DateFormat для разбора строки, и когда я печатаю значение даты, оно дает мне то, что я ожидаю.

Но когда я пытаюсь получить день, месяц или год, которые мне даютнеправильные значения.Например, 2011 год, но когда я делаю .getYear(), это дает мне 111. Я понятия не имею, почему это происходит.Вот соответствующий сегмент кода:

    Date dateFrom = null;

    String gDFString = g.getDateFrom();

    System.out.println(gDFString);

    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

    try {
        dateFrom = df.parse("04/12/2011");

        System.out.println(dateFrom);

        System.out.println(dateFrom.getYear());
    } catch (ParseException e) {
        e.printStackTrace();
    }

Когда я распечатываю dateFrom, я получаю Sun Dec 04 00:00:00 GMT 2011, что вы и ожидаете.Но печать .getYear() возвращает 111.

Мне нужно иметь возможность получить день, месяц и год даты для графика временного ряда.

Ответы [ 6 ]

42 голосов
/ 27 августа 2011

Эти методы были устарели .Вместо этого используйте класс Календарь .


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public final class DateParseDemo {
    public static void main(String[] args){
         final DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
         final Calendar c = Calendar.getInstance();
         try {
             c.setTime(df.parse("04/12/2011"));
             System.out.println("Year = " + c.get(Calendar.YEAR));
             System.out.println("Month = " + (c.get(Calendar.MONTH)));
             System.out.println("Day = " + c.get(Calendar.DAY_OF_MONTH));
         } 
         catch (ParseException e) {
             e.printStackTrace();
         }
    }
}

Вывод :

Year = 2011
Month = 3
Day = 12

А что касается поля month , то оно основано на 0,Это означает, что январь = 0 и декабрь = 11. Как указано в javadoc ,

Номер поля для получения и установки с указанием месяца.Это значение для календаря.Первый месяц года в григорианском и юлианском календарях - JANUARY, что составляет 0;последний зависит от количества месяцев в году.

10 голосов
/ 27 августа 2011

Javadoc на помощь:

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

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

Не следует использовать устаревшие методы.Устаревшие методы - это методы, которые больше не должны использоваться.Но какой бы метод вы ни использовали, прочитайте его javadoc, чтобы узнать, что он делает.

9 голосов
/ 27 марта 2013

Президент Зло прибил его, Date.getYear() возвращает значение, которое является результатом вычитания 1900 из года, который содержит.И вы не должны его использовать.

Но быстрое решение для кода в вопросе:

Date dateFrom = null;

String gDFString = g.getDateFrom();

System.out.println(gDFString);

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

try {
    dateFrom = df.parse("04/12/2011");

    System.out.println(dateFrom);

    // Add 1900 to dateFrom.getYear() 

    System.out.println(dateFrom.getYear()+1900);
} catch (ParseException e) {
    e.printStackTrace();
}
3 голосов
/ 08 сентября 2016

tl; dr

int year = 
    LocalDate.parse( 
        "04/12/2011" , 
        DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.US ) 
    ).getYear() ;  

2011

java.time

Беспокоящий класс java.util.Date и его братья и сестры теперь замененыотличные java.time классы

String input = "04/12/2011";
Locale locale = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( locale );
LocalDate ld = LocalDate.parse( input , f );

В классах java.time используется разумная нумерация:

  • Месяцы 1-12 января-декабря
  • 2011 означает 2011
  • Дни недели - 1-7 для понедельника-воскресенья (для ISO 8601 ).

Опрос LocalDate для его составных частей.

int year = ld.getYear();  // 2011
int month = ld.getMonthValue();  // 4
int dayOfMonth = ld.getDayOfMonth();  // 12

Вы даже можете запросить автоматически локализованное название месяца и название дня недели.

String monthName = ld.getMonth().getDisplayName( TextStyle.FULL_STANDALONE , Locale.CANDA_FRENCH ); // avril

О java.time

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

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

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

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

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

3 голосов
/ 27 августа 2011

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Date.html#getYear%28%29

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

3 голосов
/ 27 августа 2011

Это только предположение, но 111 может быть числом лет с 1900 года. Посмотрите документацию / проведите несколько тестов, чтобы убедиться в этом (я не могу проверить в данный момент)

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