我正在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中进行验证?
答案 0 :(得分:5)
PostgreSQL不支持该范围内的时间戳。
该特定年份将在date
类型的范围内(没有时间部分)。但timestamp
类型都不能容纳2,015,123年。
有关支持的范围,请参阅文档页面Date/Time Types。
答案 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可能都是错误的。