带有 java.util.Date 输入的 Postgres 上的时间戳超出范围错误

Timestamp out of range error on Postgres with a java.util.Date input

我正在从年份为 2015123String 创建一个 Date 对象,然后尝试将其保存到 Postgres。它在 Java 代码中正确创建了一个 Date 对象,但在将其保存到数据库时出现错误 timestamp out of range

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date date = sdf.parse("06/09/2015123"); // Here I inserted year 2015123.

它正在像这样转换一个日期对象。

2015123-06-09 00:00:00.0

当我试图将它保存在 Postgres 中时,它给我一个错误。

timestamp out of range

我想验证 java 中的 Date 对象。尽管存在 Postgres 错误,是否有可能在 Java 中进行验证?

超出范围

PostgreSQL 不支持该范围内的时间戳。

该特定年份将在 date 类型(没有时间部分)的范围内。但是 timestamp 类型都不能容纳 2,015,123 年。

有关支持的范围,请参阅文档页面,Date/Time Types

范围(在默认构建中)

  • 时间戳
    • 公元前 4,713 年至公元 294,276 年
  • 日期
    • 公元前 4,713 年至公元 5,874,897 年

方法setLenient(false)将无济于事。但是你可以这样做:

SimpleDateFormat f = new SimpleDateFormat("MM/dd/yyyy");
f.setLenient(false);
Date date = f.parse("06/09/2015123"); // Here I inserted year 2015123.
System.out.println(date); // Sat Jun 09 00:00:00 CEST 2015123
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
System.out.println("Out of range: " + (cal.get(Calendar.YEAR) > 9999)); // Out of range: true

SQL-规范只要求支持直到 9999 年。PostgreSQL 甚至支持到 294276 AD 的时间戳列,但这仍然不够。您应该定义自己合理的上限,因为从用户的角度来看,即使是 9999 也可能是错误的。