带有 java.util.Date 输入的 Postgres 上的时间戳超出范围错误
Timestamp out of range error on Postgres with a java.util.Date input
我正在从年份为 2015123
的 String
创建一个 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 也可能是错误的。
我正在从年份为 2015123
的 String
创建一个 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 也可能是错误的。