java - 从 java.util.Date 到 java.sql.Timestamp 时添加了无法解释的零

标签 java date timestamp unix-timestamp java.util.date

考虑以下测试代码 ( Try it here yourself on ideone.com - an online Java compiler ):

class Main {
    public static void main (String[] args) throws Exception {
        Main m = new Main();
        m.test1();
        System.out.println();
        m.test2();
    }

    void test1() throws Exception {
        System.out.println("TEST 1: ");

        String strTimestamp = "1957-04-27 00:00:00.01";
        System.out.println(strTimestamp + " [Original String]");

        String format = "yyyy-MM-dd HH:mm:ss.SS";
        System.out.println(format + " [Format used]");
        java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(format);

        // Convert String to Date:
        java.util.Date date = formatter.parse(strTimestamp);
        long time = date.getTime();
        System.out.println(formatter.format(time) + " [Date#getTime() with same format]");

        java.sql.Timestamp timestamp = new java.sql.Timestamp(time);
        System.out.println(timestamp + " [Timestamp]");
    }

    void test2() throws Exception {
        System.out.println("TEST 2: ");

        String strTimestamp = "1957-04-27 00:00:00.001";
        System.out.println(strTimestamp + " [Original String]");

        String format = "yyyy-MM-dd HH:mm:ss.SSS";
        System.out.println(format + " [Format used]");
        java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(format);

        // Convert String to Date:
        java.util.Date date = formatter.parse(strTimestamp);
        long time = date.getTime();
        System.out.println(formatter.format(time) + " [Date#getTime() with same format]");

        java.sql.Timestamp timestamp = new java.sql.Timestamp(time);
        System.out.println(timestamp + " [Timestamp]");
    }
}

上面的代码给出以下输出:

TEST 1: 
1957-04-27 00:00:00.01 [Original String]
yyyy-MM-dd HH:mm:ss.SS [Format used]
1957-04-27 00:00:00.01 [Date#getTime() with same format]
1957-04-27 00:00:00.001 [Timestamp]

TEST 2: 
1957-04-27 00:00:00.001 [Original String]
yyyy-MM-dd HH:mm:ss.SSS [Format used]
1957-04-27 00:00:00.001 [Date#getTime() with same format]
1957-04-27 00:00:00.001 [Timestamp]

TEST 1中,我期待[原始字符串][具有相同格式的Date#getTime()] [时间戳] 都具有相同的输出,就像在 TEST 2 中一样。

为什么TEST 1 中的[Timestamp] 与日期相比多了一个零?

最佳答案

tl;博士

您的旧代码和问题现在没有实际意义。请改用 java.time 类。

LocalDateTime.parse( 
    "1957-04-27 00:00:00.01".replace( " " , "T" ) 
).toString()

java.time

您正在使用的麻烦的 java.util.Datejava.sql.Timestamp 类现在已被遗留,被 java.time 类(class)。

您的输入字符串接近标准 ISO 8601 格式。将中间的空格替换为 T 即可遵守。 java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。

String input = "1957-04-27 00:00:00.01".replace( " " , "T" ) ;

解析为 LocalDateTime对象,因为您的输入缺少任何时区指示符或与 UTC 的偏移量。

LocalDateTime ldt = LocalDateTime.parse( input ) ;

要生成 ISO 8601 格式的字符串,只需调用 toString()。默认格式化程序根据需要使用 0-3 组三位数来显示秒小数,最多九位小数表示纳秒。

String output = ldt.toString() ;

1957-04-27T00:00:00.010

您可以使用 JDBC 4.2 及更高版本直接与 TIMESTAMP WITHOUT TIME ZONE 类型的数据库列交换 LocalDateTime 对象。

myPreparedStatement.setObject( … , ldt ) ;

和检索。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
<小时/>

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。

要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .

从哪里获取java.time类?

ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和more .

关于java - 从 java.util.Date 到 java.sql.Timestamp 时添加了无法解释的零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42372261/

相关文章:

java - 处理日期 java.util、日期 java.sql 和 SimpleDateFormat

c# - 最近完成的季度

mysql - 仅使用一次时出现 "only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause"错误

javascript - 即使客户端时间错误,也能从客户端获取正确的纪元时间

PHP:从时间戳生成相对日期/时间

java - 如何将给定列中的单个单元格作为 JTable 中的下拉菜单

java - 在java中接收参数问题

mysql获取与年份无关的月份数

java - 在 Web 服务中添加 AspectJ

缺少依赖项的类的 Java getDeclaredFields