java.time
我建议您在 Java 8 及更高版本中内置的 java.time 框架中完成大部分工作。 (Tutorial)
Instant 是 java.time 的核心类,代表UTC 时区中时间轴上的一个点。 Instant 类在nanoseconds-since-epoch 中跟踪时间,但有一个工厂method taking a count in milliseconds。
long millisecondsSinceEpoch = 1441288199000L;
Instant instant = Instant.ofEpochMilli( millisecondsSinceEpoch );
String output = instant.toString();
2015-09-03T13:49:59Z
JDBC
最终,JDBC 驱动程序将更新为直接使用新的 java.time 类型。但同时我们需要转换为java.sql.Timestamp。
java.sql.Timestamp 有新的附加方法用于与 java.time 之间的转换。
java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
String tsAsString = ts.toString( );
2015-09-03 06:49:59.0
请注意 java.sql.Timestamp 中善意但无用的功能,其中其toString 实现默默地应用您的JVM’s current default time zone。更糟糕的是,它没有附加任何调整后时区的指示符,从而使这个字符串变得更糟。
这里 java.sql.Timestamp 的 toString 应用了我的时区 America/Los_Angeles,将日期时间向后移动了七个小时。时间线上的时刻与上面看到的Instant::toString 输出相同,仅由美国西海岸的wall-time 表示。尽可能避免使用这些旧类并尽可能使用 java.time 的众多原因之一。
java.sql.Date
问题要求 java.sql.Date 是仅日期(以 UTC 表示),没有任何时间。
实际上 java.sql.Date 两者都有(UTC 时间为 00:00:00.0),但假装没有。 (这个类是 Java 早期的一个糟糕的 hack。)
要获得java.sql.Date,我们需要一个LocalDate,我们可以从LocalDateTime 获得,我们可以从Instant 获得。
LocalDate localDate = LocalDateTime.ofInstant( instant , ZoneOffset.UTC ).toLocalDate();
java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
本地日期:2015-09-03
sql日期:2015-09-03