Почему я не могу получить временную метку даты «1914-11-08 00:00:00» в часовом поясе «Европа/Амстердам»?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему я не могу получить временную метку даты «1914-11-08 00:00:00» в часовом поясе «Европа/Амстердам»?

Сообщение Anonymous »

Недавно я обновил свой MySQL-коннектор с версии 5.1.47 до 8.0.33. После этого я встретил ошибку:

Код: Выделить всё

Caused by: java.sql.SQLException: HOUR_OF_DAY: 0 -> 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:85) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.result.ResultSetImpl.getTimestamp(ResultSetImpl.java:947) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.mysql.cj.jdbc.result.ResultSetImpl.getTimestamp(ResultSetImpl.java:985) ~[mysql-connector-j-8.0.33.jar:8.0.33]
at com.zaxxer.hikari.pool.HikariProxyResultSet.getTimestamp(HikariProxyResultSet.java) ~[HikariCP-4.0.3.jar:na]
at org.hibernate.type.descriptor.sql.TimestampTypeDescriptor$2.doExtract(TimestampTypeDescriptor.java:84) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:243) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:329) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:3214) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.hibernate.persister.entity.Loadable.hydrate(Loadable.java:94) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.loadFromResultSet(EntityReferenceInitializerImpl.java:342) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
... 113 common frames omitted
Исследуя эту ошибку, я понял, что новый драйвер MySQL выполнит некоторое преобразование, а мой набор данных содержит дату «1916-05-01 00:00 00». Согласно Википедии, первое общенациональное внедрение летнего времени было осуществлено Германской и Австро-Венгерской империями, начиная с 30 апреля 1916 года. Поэтому можно подумать, что оно не может перевести '1916-05-01 00:00 00» к временной метке, поскольку «1916-05-01 00:00 00» «не существует», только «1916-05-01 01:00 00».
Я решил выяснить все эти «не -существующие» даты в часовом поясе «Европа/Амстердам». Вот как я это сделал:

Код: Выделить всё

public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
start.setTime(sdf.parse("1900-01-01"));
end.setTime(sdf.parse("2025-01-01"));
List errorItems = new ArrayList();
while (!start.after(end)) {
try {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Amsterdam"), Locale.US);
calendar.setLenient(false);
calendar.set(start.get(Calendar.YEAR), start.get(Calendar.MONTH), start.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
Timestamp ts = new Timestamp(calendar.getTimeInMillis());
System.out.println(ts);
} catch (IllegalArgumentException e) {
errorItems.add(sdf.format(start.getTime()));
}
start.add(Calendar.DAY_OF_YEAR, 1);
}
System.out.println("error date: " + errorItems);
}
Результат: [1914-11-08, 1916-05-01]
The '1916-05-01', который я получил уже понял, но почему «1914-11-08»? В 1914 году летнего времени даже не существовало. Есть ли у кого-нибудь идеи?
Я хотел бы знать, почему я не могу получить временную метку даты '1914-11-08 00 :00:00» в часовом поясе «Европа/Амстердам».

Подробнее здесь: https://stackoverflow.com/questions/784 ... mezone-eur
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»