我在列中的值是timestamp类型。可以说我有价值 2007-05-04 08:48:40.969774
现在,当尝试从数据库中获取值并将此时间戳值返回给函数时,我应该使用什么SimpleDateFormatter模式,以便返回秒旁边的小数部分。
我用过 yyyy-MM-dd hh:mm:ss,但只返回到秒,并忽略秒(.969774)旁边的分数。我还需要帮助返回这个小数部分,精度为6位数。
我在列中的值是timestamp类型。可以说我有价值 2007-05-04 08:48:40.969774
现在,当尝试从数据库中获取值并将此时间戳值返回给函数时,我应该使用什么SimpleDateFormatter模式,以便返回秒旁边的小数部分。
我用过 yyyy-MM-dd hh:mm:ss,但只返回到秒,并忽略秒(.969774)旁边的分数。我还需要帮助返回这个小数部分,精度为6位数。
格式化的默认方式 java.util.Date
(要么 java.sql.Timestamp
)只有毫秒精度。您可以使用 yyyy-MM-dd hh:mm:ss.SSS
获得毫秒精度。
一个 java.sql.Timestamp
实际上确实具有(最高)纳秒精度(假设数据库服务器和驱动程序实际上支持它)。在Java 8中格式化它的最简单方法是将时间戳转换为 java.time.LocalDateTime
(使用 Timestamp.toLocalDateTime()
)并使用 java.time
格式化选项 java.time.format.DateTimeFormatter
它支持高达纳秒。
如果使用Java 7或更早版本,则需要额外的工作,因为普通的日期格式化程序不支持它。例如,您可以使用带格式的dateformatter yyyy-MM-dd hh:mm:ss
(仅格式化为秒)并附加亚秒秒纳秒(具有适当的零填充) Timestamp.getNanos()
你自己。
您必须有一种获得微秒时间戳的方法。我将System.currentTimeMillis()与System.nanoTime()结合使用。然后你需要一种方法来显示它。您可以将其除以1000并正常显示毫秒,然后显示时间的最后3位数。即有一段时间
long timeUS = System.currentTimeMillis() * 1000 + micros;
这是一个更详细的例子
HiresTimer.java 和 HiresTimerTest.java
测试打印
2012/04/09T14:22:13.656008
2012/04/09T14:22:13.656840
2012/04/09T14:22:13.656958
2012/04/09T14:22:13.657066
....
2012/04/09T14:22:13.665249
2012/04/09T14:22:13.665392
2012/04/09T14:22:13.665473
2012/04/09T14:22:13.665581
编辑:相关的代码是
private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy/MM/dd'T'HH:mm:ss.SSS");
private static final DecimalFormat DF = new DecimalFormat("000");
public static String toString(long timeUS) {
return SDF.format(timeUS / 1000) + DF.format(timeUS % 1000);
}
在Java 8及更高版本中 java.time package支持解析和操作日期/时间到纳秒精度。这意味着在几分之一秒内最多9位数。
在Java中处理纳秒并非易事。除了以单独的方式处理它们之外,我看不到任何优雅的解决方案(格式化日期和时间 SimpleDateFormat
和纳秒 DecimalFormat
),例如,如下例所示:
package test;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.start();
}
private void start() {
long time = System.currentTimeMillis();
Date d = new Date(time);
Timestamp t = new Timestamp(time);
t.setNanos(123456789);
System.out.println(d);
System.out.println(t);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'.'");
NumberFormat nf = new DecimalFormat("000000000");
System.out.println(df.format(t.getTime()) + nf.format(t.getNanos()));
}
}
产生的输出是(在我的国家,我的语言环境):
Mon Apr 09 16:27:27 CEST 2012 2012-04-09 16:27:27.123456789 2012-04-09 16:27:27.123456789