我在列中有一个时间戳类型的值。假设我有一个值2007-05-04 08:48:40.969774
现在,当尝试从数据库中获取值并将这个时间戳值返回给函数时,我应该使用什么 SimpleDateFormatter 模式,以便秒旁边的小数部分也被返回。
我使用了yyyy-MM-dd hh:mm:ss,但它只返回到秒数并忽略秒数旁边的分数(.969774)。我还需要帮助以 6 位精度返回这个小数部分。
我在列中有一个时间戳类型的值。假设我有一个值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
来获得毫秒精度。
Ajava.sql.Timestamp
实际上确实具有(高达)纳秒精度(假设数据库服务器和驱动程序实际上支持它)。在 Java 8 中格式化它的最简单方法是将时间戳转换为java.time.LocalDateTime
(使用Timestamp.toLocalDateTime()
)并使用支持高达纳秒的java.time
格式化选项。java.time.format.DateTimeFormatter
如果您使用 Java 7 或更早版本,则需要付出一些额外的努力,因为普通的日期格式化程序不支持它。例如,您可以使用带有模式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 中处理微秒或纳秒并不总是那么简单。
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class Main {
public static void main(String args[]) throws Exception {
long time = System.currentTimeMillis();
Date d = new Date(time);
Timestamp t = new Timestamp(time);
/* micro-seconds as OP requested */
{
t.setNanos(123456000);
System.out.println(d);
System.out.println(t);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'.'");
NumberFormat nf = new DecimalFormat("000000");
System.out.println(df.format(t.getTime()) + nf.format(t.getNanos() / 1000));
/* using Java Time API (available since JDK 1.8) */
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
LocalDateTime ldt = t.toLocalDateTime();
System.out.println(ldt.format(dtf));
}
/* nanoseconds just for the sake of completness */
{
t.setNanos(123456789);
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()));
/* using Java Time API (available since JDK 1.8) */
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnnnn");
LocalDateTime ldt = t.toLocalDateTime();
System.out.println(ldt.format(dtf));
}
}
}
产生的输出是(在我的国家,我的语言环境):
2021 年 8 月 31 日星期二 13:26:08 CEST 2021-08-31 13:26:08.123456 2021-08-31 13:26:08.123456 2021-08-31 13:26:08.123456 2021-08-31 13:26:08.123456789 2021-08-31 13:26:08.123456789 2021-08-31 13:26:08.123456789
在 Java 8 及更高版本中,java.time包支持将日期/时间解析和操作到纳秒精度。这意味着在几分之一秒内最多可输入 9 位数字。