问题 如何打印秒数值最多6位精度的时间


我在列中的值是timestamp类型。可以说我有价值 2007-05-04 08:48:40.969774

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

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


4974
2018-04-09 13:20


起源

看一下文档: docs.oracle.com/javase/6/docs/api/java/text/...。那里有一个格式说明符列表。 - Oliver Charlesworth
为了解释原因,无论是谁投资了?这个问题没有错。是否有可能在java中获得百万分之一秒的精度。 - Surya Chandra
+1我认为这是一个合理的问题。我想这个downvoter并没有意识到处理微秒a)不是微不足道的,或者b)很可能。 - Peter Lawrey
我认为Timestamp可以处理数据库中的纳秒,看一看 docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html - woliveirajr


答案:


格式化的默认方式 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() 你自己。


6
2018-04-09 13:24





您必须有一种获得微秒时间戳的方法。我将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);
}

3
2018-04-09 14:04



System.nanoTime() 不返回与绝对时间有任何相关性的值。它仅对测量两次调用之间的经过时间有用 System.nanoTime()。 stackoverflow.com/q/1712205/260633 - Dev
它可以测量currentTimeMillis的经过时间,这意味着你可以很好地了解微秒是什么。 - Peter Lawrey
System.nanoTime() 无法测量除自上次呼叫以来经过的时间以外的任何事情 System.nanoTime()。这个时代是不确定的。所以它只对自己有用。 - Dev
因此,您可以确定自上次调用currentTimeMillis以来已经有多少微秒。一旦确定currentTimeMillis上次更改的时间,就有一个已知的时间点,从中可以计算微秒,甚至纳秒。 - Peter Lawrey
我猜测downvoter没有读取代码,并没有尝试将currentTimeMillis()和nanoTime()放在一起。 - Peter Lawrey


在Java 8及更高版本中 java.time package支持解析和操作日期/时间到纳秒精度。这意味着在几分之一秒内最多9位数。


2
2018-04-12 21:19



你能提供和示例吗? - Jason


在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

1
2018-04-09 14:31



问题是微/纳秒始终为零。 - Peter Lawrey
我认为它们可以由数据库子系统设置(根据问题)。我编辑了代码来证明...... - Jiri Patera
实际上,该问题是关于微秒而不是纳秒。 - Basil Bourque