Как печатать время до 6 цифр точности для значения секунд
У меня есть значение в столбце, которое имеет временную метку типа. Допустим, что у меня есть значение 2007-05-04 08: 48: 40.969774
Теперь, пытаясь извлечь значение из базы данных и вернуть значение этой метки в функцию, какой шаблон SimpleDateFormatter следует использовать, чтобы часть дроби в секундах также возвращалась.
Я использовал yyyy-MM-dd hh: mm: ss, но возвращается только до секунд и игнорирует долю, присутствующую рядом с секундами (.969774). Мне также нужна помощь в возврате этой части с 6-значной точностью.
Ответы
Ответ 1
Стандартные способы форматирования java.util.Date
(или java.sql.Timestamp
) имеют только миллисекундную точность. Вы можете использовать yyyy-MM-dd hh:mm:ss.SSS
для получения этой миллисекундной точности.
A 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
(только для форматирования до нескольких секунд) и присоединить субсекунды nano seconds (с соответствующим нулевым дополнением) Timestamp.getNanos()
самостоятельно.
Ответ 2
У вас должен быть способ получения временной отметки в микросекундах. Я использую 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
EDIT: соответствующий код
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
В Java 8 и более поздних версиях пакет java.time поддерживает разбор и обработку даты/времени до наносекундной точности. Это означает, что до девяти цифр в доли секунды.
Ответ 4
Работа с наносекундами в 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