Java.util.Date формат SSSSSS: если не микросекунды, то какие последние 3 цифры?
Просто протестировал этот код как на моей рабочей станции Windows (8), так и на AIX:
public static void main(String[] args) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date()));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date()));
}
и получилось нечто похожее на это:
2013-10-07 12:53:26.000905
2013-10-07 12:53:26.000906
Может кто-нибудь, пожалуйста, объясните мне, какие последние цифры, если не микросекунды?
Примечание. Я взаимодействую с базой данных DB2, в которой хронологические данные хранятся с использованием временных столбцов как TIMESTAMP с 6 цифрами ПОСЛЕ секунд, то есть микросекунд (IMO).
Но все эти "временные метки" создаются путем запроса следующего запроса:
SELECT current timestamp as currenttimestamp FROM Table ( values (1)) temp
Интересно, что, учитывая приведенные выше результаты, я не мог просто использовать в своем коде new Date()
вместо выбора current timestamp
из базы данных.
Спасибо.
PS: Я искал, но не нашел соответствующих (ответных) вопросов, например:
Текущее время в микросекундах в java
или
Получите время с часами, минутами, секундами, миллисекундами, микросекундами
Ответы
Ответ 1
Из документации SimpleDateFormat:
Letter Date or Time Component Presentation Examples
S Millisecond Number 978
Таким образом, это миллисекунды, или 1/1000th секунды. Вы просто отформатируете его на 6 цифр, так что вы добавите 3 дополнительных ведущих нуля...
Вы можете проверить это так:
Date d =new Date();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSS").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSS").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(d));
Вывод:
2013-10-07 12:13:27.132
2013-10-07 12:13:27.132
2013-10-07 12:13:27.132
2013-10-07 12:13:27.0132
2013-10-07 12:13:27.00132
2013-10-07 12:13:27.000132
(Идеальная скрипка)
Ответ 2
ТЛ; др
Instant.now()
.toString()
2018-02-02T00: 28: 02.487114Z
java.time
Принятый ответ ppeterka верен. Ваше злоупотребление шаблоном форматирования приводит к ошибочному отображению данных, тогда как внутреннее значение всегда ограничено миллисекундами.
Несложные классы SimpleDateFormat
и Date
которые вы используете, теперь являются устаревшими, вытесняются классами java.time. Классы java.time обрабатывают разрешение наносекунд, намного более тонкое, чем предел миллисекунд унаследованных классов.
Эквивалент java.util.Date
- java.time.Instant
. Вы можете даже конвертировать между ними, используя новые методы, добавленные к старым классам.
Instant instant = myJavaUtilDate.toInstant() ;
Instant
класс представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Захват текущего момента в UTC. Java 8 фиксирует текущий момент в миллисекундах, в то время как новая реализация Clock
в Java 9 фиксирует момент в более тонкой детализации, как правило, микросекунды, хотя это зависит от возможностей ваших компьютерных аппаратных часов и реализации ОС и JVM.
Instant instant = Instant.now() ;
Создайте строку в стандартном формате ISO 8601.
String output = instant.toString() ;
2018-02-02T00: 28: 02.487114Z
Чтобы генерировать строки в других форматах, поиск для DateTimeFormatter
уже многократно рассмотрен.
Чтобы настроить ZonedDateTime
зону, ZonedDateTime
от UTC, используйте ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;
О java.time
Рамка java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.
Где можно получить классы java.time?
- Java SE 8, Java SE 9 и более поздние версии
- Встроенный.
- Часть стандартного Java API с интегрированной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport.
- Android
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
Ответ 3
Я использовал еще один трюк для форматирования даты с 6-разрядной точностью (микросекунды):
System.out.println(
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.").format(microseconds/1000)
+String.format("%06d", microseconds%1000000));
Эта техника может быть продолжена до наносекунд и вверх.
Ответ 4
Используйте java.sql.Timestamp.toString, если вы хотите получить дробные секунды в текстовом представлении. Разница между временной шкалой от DB и Java Date заключается в том, что точность БД составляет наносекунды, а точность даты Java - миллисекунды.
Ответ 5
SSSSSS - это микросекунды. Скажем, время 10:30:22 (Seconds 22) и 10: 30: 22.1 будет 22 секунды и 1/10 секунды. Расширение той же логики, 10: 32.22.000132 будет 22 секунды и 132/1 000 000 секунд, что составляет всего лишь микросекунды.