【问题标题】:java.sql.Time object being confused with java.sql.Date objectjava.sql.Time 对象与 java.sql.Date 对象混淆
【发布时间】:2012-05-21 02:51:40
【问题描述】:

我正在查询一个 MySQL 表并选择 varchar、Date、Time、Double 和 Boolean 数据类型。我从 ResultSet 中获取数据并将其放入 DefaultTableModel 中,然后将其放入 JTable 中,然后放入 JScrollPane 中进行显示。

所有数据都正确显示,除了其中包含 java.sql.Time 对象的列。这些被显示为一个日期对象,它们的值都是 1970 年 1 月 1 日。

似乎 java.sql.Time 对象被读取为 java.sql.Date 对象(我猜 1970 年 1 月 1 日被返回,因为时间值超出了对日期对象有效的范围)。

我很困惑,因为如果我覆盖 DefaultTableModel 中的 getColumnClass 方法以始终返回 String.class 并使用表方法 setAutoCreateRowSorter(true),当我单击包含 java.sql.Time 对象的列的标题进行排序时它,抛出 java.lang.ClassCastException,它说 java.sql.time 不能转换为字符串。为什么这会正确地将数据识别为 java.sql.Time,但是如果我重写 DefaultTableModel getColumnClass 以返回正确的类,它会将其视为日期而不是时间?任何解决问题的帮助将不胜感激。下面是我如何在 DefaultTableModel 中覆盖他的 getColumnClass 方法:

        model = new DefaultTableModel() {
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                if (columnIndex == numberOfColumns) {
                    return Boolean.class;
                } else {
                    return getValueAt(1, columnIndex).getClass(); //return actual class
                    return String.class; //return string regardless of what class is
                }
            }
        };

【问题讨论】:

  • this 有帮助吗?您正在将java.sql.Time 时间戳解析为String。这是不好的形式。
  • 该链接让我对正在发生的事情有了更好的了解。 JTable 将 java.sql.time 和 java.sql.date 对象都视为 java.util.date 的子类,因此两者都显示为日期,而不是日期显示为日期,时间显示为时间。关于如何正确显示 java.sql.time 对象的任何想法?
  • 再次强调,手动执行此操作是不正确的。您的 MySQL JDBC 驱动程序应该隐藏有关时间戳的所有细节,并且应该只返回时间戳。如链接中所述,使用ResultSet#getTimestamp()

标签: java mysql date jdbc time


【解决方案1】:

ClassCastException 即将到来,因为您试图将 Time 类转换为字符串。它显示为 Date 对象,因为 java.sql.Time 和 java.sql.Date 都是 java.util.Date 的子类。这些子类只是简单的包装器(同样的,只有足够的额外信息可以映射到 SQL 列)。所以在 Swing JTable 中,它被用作 java.util.Date,因为 java.sql 类型在大多数情况下与 Swing 组件无关。

【讨论】:

  • 我实际上并没有尝试将 Time 类转换为字符串。我这样做只是为了表明,如果我将 Time 对象转换为 String,则 ClassCastException 会正确地将其识别为 java.sql.Time 对象,但如果我没有错误地转换它,JTable 会将 Time 对象误认为是日期对象。有关如何解决此问题的任何建议?
  • 就像我说的时间是日期的子类。所以 JTable 正在处理 Date 对象并且看不到 Date 和 Time 之间的任何区别。绕过这个到底是什么意思?您是在问如何只显示时间还是什么?
  • 是的,我想弄清楚如何显示时间。请不要告诉我不要覆盖 getColumnClass。我需要为我在 JTable 中进行的一些自定义渲染手动指定一列的类。如果我不覆盖 DefaultTableModel 中的 getColumnClass 方法,则时间会正确显示。但是,如果我覆盖上述方法以返回 getValueAt(row, column).getClass() 则包含 java.sql.time 的列显示 Jan 1, 1970,而包含 java.sql.Timestamp 的列仅显示日期部分对象。
  • 如果您想覆盖日期显示方式的默认行为,您可以使用 CustomRenderer docs.oracle.com/javase/tutorial/uiswing/components/…。或者您可以仅使用时间格式化日期并将其显示为字符串。哪个对你有用,伙计。如果这也不起作用,请告诉我!
猜你喜欢
  • 2015-06-26
  • 1970-01-01
  • 2011-03-04
  • 2012-03-04
  • 2010-11-30
  • 2012-07-30
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多