Java.util.date год больше трех тысяч

У меня есть приложение, которое вставляет дату в базу данных. Когда я открыл записи с помощью Eclipse neon в Data Source Explorer, я обнаружил, что годы в дате имеют значение "3916" (пример: 3916-10-05). Зная, что переменные имеют тип java.util.date и что столбец в базе данных имеет тип DATE.


person Chayma Atallah    schedule 16.06.2017    source источник
comment
Можете ли вы поделиться кодом, который заполняет даты Java?   -  person Tim Biegeleisen    schedule 16.06.2017
comment
Вероятно, это та же проблема, что и в этом вопросе: java.util.Date и getYear(), только если смотреть с противоположной стороны.   -  person Ole V.V.    schedule 17.06.2017


Ответы (1)


Я думаю, этот пример поможет вам понять, в чем ваша настоящая проблема (попробуйте):

import java.util.Date;
import java.io.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Date date = new Date(1475625600000L); //2016-10-05
        int year = date.getYear();
        System.out.println("Year from epoch: " + date.getYear());
        date.setYear(2016);
        System.out.println("Year from setYear() " + date.getYear());
        System.out.println("Full date: " + date.toString());
    }
}

Это напечатает

Year from epoch: 116
Year from setYear() 2016
Full date: Thu Oct 05 00:00:00 GMT 3916

java.util.Date немного странный, когда дело доходит до обработки лет в датах. Он использует смещение 1900, когда вы устанавливаете годы и вычитаете его, когда вы получаете годы из дат.

Из документации:

getYear()
Deprecated. 
As of JDK version 1.1, replaced by Calendar.get(Calendar.YEAR) - 1900.

setYear(int year)
Deprecated. 
As of JDK version 1.1, replaced by Calendar.set(Calendar.YEAR, year + 1900).

Если вы попытаетесь установить год в виде 4-значной формы, вы получите дату после 3900.

person Laposhasú Acsa    schedule 16.06.2017
comment
Очень вероятная гипотеза, согласен. Реальным и хорошим решением было бы полностью отказаться от устаревших классов Date и Calendar и вместо них использовать современные классы API java.time, например LocalDate. С достаточно новым драйвером JDBC их можно вставить непосредственно в базу данных. - person Ole V.V.; 17.06.2017