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
    • Более поздние версии реализаций пакетов Android классов java.time.
    • Для более ранних Android проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Раздел Как использовать ThreeTenABP....

Проект 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 секунд, что составляет всего лишь микросекунды.