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

use*_*574 2 java postgresql timestamp date

我正在创建一个年份的Date对象,然后尝试将其保存到Postgres.它正在Java代码中正确创建一个对象,但在将其保存到数据库时会出错.String2015123Datetimestamp out of range

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

它正在转换像这样的日期对象.

2015123-06-09 00:00:00.0
Run Code Online (Sandbox Code Playgroud)

虽然我想在Postgres中保存它,但它给了我一个错误.

timestamp out of range
Run Code Online (Sandbox Code Playgroud)

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

Eel*_*lke 6

超出范围

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

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

有关支持的范围,请参阅文档页面,日期/时间类型.

范围(默认构建)

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


Men*_*ild 5

该方法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
Run Code Online (Sandbox Code Playgroud)

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