【问题标题】:Timestamp out of range error on Postgres with a java.util.Date input带有 java.util.Date 输入的 Postgres 上的时间戳超出范围错误
【发布时间】:2015-09-03 21:09:33
【问题描述】:

我正在从String 创建一个Date 对象,其中年份是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 中进行验证?

【问题讨论】:

  • 我试过了,但没有成功。

标签: java postgresql date timestamp


【解决方案1】:

超出范围

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

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

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

范围(默认构建)

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

【讨论】:

    【解决方案2】:

    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 年,但这仍然不够。您应该定义自己的合理上限,因为从用户的角度来看,即使 9999 也可能是错误的。

    【讨论】:

    • 感谢您的回答。 setLenient(false) 对我不起作用。我使用cal.get(Calendar.YEAR) > 9999) 解决了这个问题。
    • 难道你不应该做 GregorianCalendar.getInstance() 而不是 new GregorianCalendar()?
    • @Amalgovinus 我强烈建议人们尽可能使用具体日历。在这里,OP显然想要公历,而不是例如泰国的佛教日历。经常引用的使用接口或抽象类的规则不适用于日期/时间问题,另请参阅较新接口 java.time.chrono.ChronoLocalDate 的文档。
    • 我不是指哪个日历类,而是在制作时使用“getInstance()”还是“new”?
    • @Amalgovinus 使用getInstance() 时,您可以获得非公历(实际上只有在您的默认语言环境是泰国时才会出现这种情况)。例如,这对年份数产生了不良且大多出乎意料的深刻影响。使用构造函数时,您可以保证获得公历,否则不会。此外:GregorianCalendar.getInstance() 与使用静态继承的Calendar.getInstance() 相同(设计结果未绑定到公历)。
    猜你喜欢
    • 2020-05-10
    • 2015-10-17
    • 1970-01-01
    • 2017-05-27
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    相关资源
    最近更新 更多