如何打印时间高达6位精度的秒值

2022-09-03 14:30:55

我在列中有一个时间戳类型的值。假设我有一个值 2007-05-04 08:48:40.969774

现在,当尝试从数据库获取值并将此时间戳值返回给函数时,我应该使用什么 SimpleDateFormatter 模式,以便秒旁边的分数部分也返回。

我用过yyyy-MM-dd hh:mm:ss,但这只返回到秒,并忽略秒(.969774)旁边存在的分数。我也需要帮助以6位精度返回此分数部分。


答案 1

格式化(或 )的默认方法只有毫秒级精度。您可以使用 来获得该毫秒级精度。java.util.Datejava.sql.Timestampyyyy-MM-dd hh:mm:ss.SSS

实际上具有(最多)纳秒精度(假设数据库服务器和驱动程序实际支持它)。在Java 8中格式化它的最简单方法是将时间戳转换为(使用),并使用支持纳秒的格式设置选项。java.sql.Timestampjava.time.LocalDateTimeTimestamp.toLocalDateTime()java.timejava.time.format.DateTimeFormatter

如果您使用Java 7或更早版本,则需要一些额外的努力,因为正常的日期格式化程序不支持它。例如,您可以使用带有模式的日期格式化程序(最多只能格式化几秒钟),并附加自己的亚秒纳秒(具有适当的零填充)。yyyy-MM-dd hh:mm:ssTimestamp.getNanos()


答案 2

您必须有一种方法可以获得微秒时间戳。我将 System.currentTimeMillis() 与 System.nanoTime() 结合使用。然后,您需要一种方法来显示它。您可以将其除以 1000 并正常显示毫秒,然后显示时间的最后 3 位数字。即有一个像这样的时间

long timeUS = System.currentTimeMillis() * 1000 + micros;

这是一个更详细的示例

HiresTimer.javaHiresTimerTest.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);
}