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

时间:2015-06-18 09:39:18

标签: java postgresql date timestamp

我正在Date创建一个String对象,其中年份为2015123,然后尝试将其保存到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中进行验证?

2 个答案:

答案 0 :(得分:5)

超出范围

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

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

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

范围(默认构建中)

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

答案 1 :(得分:4)

方法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可能都是错误的。