Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to print time up to 6 digits of precision for seconds value

I have a value in column which is of type timestamp. Lets say I have a value 2007-05-04 08:48:40.969774

Now, when trying to fetch the value from the database and return this timestamp value to a function, what SimpleDateFormatter pattern should I use so that the fraction part beside the seconds also gets returned.

I have used yyyy-MM-dd hh:mm:ss, but that only returns till the seconds and ignores the fraction present beside the seconds(.969774). I need help in returning this fraction part also, with a 6-digits precision.

like image 235
Surya Chandra Avatar asked Apr 09 '12 13:04

Surya Chandra


3 Answers

The default ways of formatting a java.util.Date (or java.sql.Timestamp) has only millisecond precision. You can use yyyy-MM-dd hh:mm:ss.SSS to get that millisecond precision.

A java.sql.Timestamp actually does have (up to) nanosecond precision (assuming the database server and the driver actually support it). The easiest way to format it in Java 8 is to convert the timestamp to a java.time.LocalDateTime (using Timestamp.toLocalDateTime()) and use the java.time formatting options in java.time.format.DateTimeFormatter which support up to nanoseconds.

If you use Java 7 or earlier it will take some extra effort, as the normal date formatters don't support it. For example you could use a dateformatter with pattern yyyy-MM-dd hh:mm:ss (to only format up to seconds) and append the sub-second nano seconds (with appropriate zero-padding) of Timestamp.getNanos() yourself.

like image 171
Mark Rotteveel Avatar answered Oct 22 '22 01:10

Mark Rotteveel


You have to have a way of obtaining a micro-second timestamp. I use System.currentTimeMillis() with System.nanoTime() in combination. Then you need a way to display it. You can divide it by 1000 and display milliseconds as normal, then display the last 3 digits of the time. i.e. Have a time which is like

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

here is a more detailed example

HiresTimer.java and HiresTimerTest.java

The test prints

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

EDIT: The relevant code is

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);
}
like image 45
Peter Lawrey Avatar answered Oct 22 '22 02:10

Peter Lawrey


In Java 8 and later, the java.time package has support for parsing and manipulating date/times to nanosecond precision. That means up to 9 digits in the fraction of a second.

like image 2
Jonathan Millman Avatar answered Oct 22 '22 02:10

Jonathan Millman