Как отобразить миллисекунды или микросекунды во времени?
Используйте Intl.DateTimeFormat для отображения времени с точностью до долей секунды
Введение
Обычно время отображается в часах, минутах и секундах. Такой точности достаточно для расписаний, встреч и повседневного отслеживания времени. Однако некоторые приложения требуют отображения времени с точностью до долей секунды — десятых, сотых или тысячных долей.
Инструменты мониторинга производительности показывают время отклика в миллисекундах. В научных приложениях измерения отображаются с субсекундной точностью. В видео- и аудиоприложениях временные метки могут указываться вплоть до миллисекунды. Системы логирования записывают события с временными метками, содержащими доли секунды, чтобы различать события, произошедшие почти одновременно.
В JavaScript Intl.DateTimeFormat поддерживает опцию fractionalSecondDigits для отображения времени с точностью до долей секунды. В этом уроке объясняется, что такое дробные секунды, как их отобразить и когда требуется такая точность.
Что такое точность до долей секунды
Секунда — это базовая единица измерения времени. Дробные секунды — это части секунды, меньшие одной целой секунды.
Одна десятая секунды — это 0,1 секунды, или 100 миллисекунд. Такая точность позволяет различать события, произошедшие с разницей менее одной десятой секунды.
Одна сотая секунды — это 0,01 секунды, или 10 миллисекунд. Такая точность позволяет различать события, произошедшие с разницей менее одной сотой секунды.
Одна тысячная секунды — это 0,001 секунды, или 1 миллисекунда. Это максимальная точность, поддерживаемая Intl.DateTimeFormat.
В JavaScript дробные секунды отображаются как цифры после десятичной точки. Одна цифра — десятые, две — сотые, три — тысячные доли секунды.
О микросекундах
В заголовке урока упоминаются микросекунды, но Intl.DateTimeFormat не поддерживает точность до микросекунд. Микросекунды — это миллионные доли секунды, для их отображения нужно шесть знаков после запятой. API поддерживает максимум три знака, что соответствует миллисекундной точности.
Внутри объекты Date в JavaScript хранят время как количество миллисекунд с 1 января 1970 года по UTC. Это значит, что данные поддерживают точность до миллисекунд, но не до микросекунд.
Использование опции fractionalSecondDigits
Опция fractionalSecondDigits определяет, сколько знаков после запятой будет отображаться в поле секунд. Она принимает значения 1, 2 или 3.
Вы должны указать опцию second при использовании fractionalSecondDigits. Без опции second форматтер полностью опускает поле секунд, и опция дробных секунд не работает.
const date = new Date('2025-10-15T14:23:45.678');
const formatter = new Intl.DateTimeFormat('en-US', {
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
fractionalSecondDigits: 3
});
console.log(formatter.format(date));
// Output: "2:23:45.678 PM"
Этот форматтер отображает часы, минуты, секунды и три знака дробных секунд. Объект Date содержит точность до миллисекунд, и форматтер показывает все три знака.
Отображение одной дробной цифры секунды
Если установить fractionalSecondDigits в 1, будут отображаться десятые доли секунды.
const date = new Date('2025-10-15T14:23:45.678');
const formatter = new Intl.DateTimeFormat('en-US', {
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
fractionalSecondDigits: 1
});
console.log(formatter.format(date));
// Output: "2:23:45.6 PM"
Форматтер округляет значение до одного знака после запятой. Исходное значение содержит 678 миллисекунд, что равно 0,678 секунды, и при отображении с одной цифрой округляется до 0,6 секунды.
Отображение двух дробных цифр секунды
Если установить fractionalSecondDigits в 2, будут отображаться сотые доли секунды.
const date = new Date('2025-10-15T14:23:45.678');
const formatter = new Intl.DateTimeFormat('en-US', {
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
fractionalSecondDigits: 2
});
console.log(formatter.format(date));
// Output: "2:23:45.67 PM"
Форматтер округляет значение до двух знаков после запятой. Значение 678 миллисекунд — это 0,678 секунды, и при отображении с двумя цифрами округляется до 0,67 секунды.
Отображение трёх знаков после запятой для секунд
Если установить fractionalSecondDigits в 3, будут отображаться тысячные доли секунды, то есть миллисекунды.
const date = new Date('2025-10-15T14:23:45.678');
const formatter = new Intl.DateTimeFormat('en-US', {
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
fractionalSecondDigits: 3
});
console.log(formatter.format(date));
// Output: "2:23:45.678 PM"
Это обеспечивает максимальную точность до миллисекунд, доступную в объектах Date в JavaScript. Три знака — это максимальная поддерживаемая точность для Intl.DateTimeFormat.
Совмещение с 24-часовым форматом времени
Доли секунды работают с любыми вариантами форматирования времени, включая 24-часовой формат.
const date = new Date('2025-10-15T14:23:45.678');
const formatter = new Intl.DateTimeFormat('en-GB', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
fractionalSecondDigits: 3,
hourCycle: 'h23'
});
console.log(formatter.format(date));
// Output: "14:23:45.678"
В британском английском по умолчанию используется 24-часовой формат времени, а опция hourCycle гарантирует 24-часовой формат. Доли секунды отображаются после секунд через десятичную точку.
Включение часового пояса с долями секунды
Можно отображать доли секунды вместе с информацией о часовом поясе.
const date = new Date('2025-10-15T14:23:45.678Z');
const formatter = new Intl.DateTimeFormat('en-US', {
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
fractionalSecondDigits: 3,
timeZone: 'America/New_York',
timeZoneName: 'short'
});
console.log(formatter.format(date));
// Output: "10:23:45.678 AM EDT"
Этот форматтер преобразует время UTC в время Нью-Йорка и показывает результат с точностью до миллисекунд и аббревиатурой часового пояса.
Как форматируются доли секунды в разных локалях
В разных локалях используются разные десятичные разделители для чисел, но для долей секунды всегда используется точка как разделитель во всех локалях.
const date = new Date('2025-10-15T14:23:45.678');
const options = {
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
fractionalSecondDigits: 3
};
const en = new Intl.DateTimeFormat('en-US', options);
console.log(en.format(date));
// Output: "2:23:45.678 PM"
const de = new Intl.DateTimeFormat('de-DE', options);
console.log(de.format(date));
// Output: "14:23:45.678"
const fr = new Intl.DateTimeFormat('fr-FR', options);
console.log(fr.format(date));
// Output: "14:23:45.678"
const ar = new Intl.DateTimeFormat('ar-SA', options);
console.log(ar.format(date));
// Output: "٢:٢٣:٤٥٫٦٧٨ م"
В английском используется 12-часовой формат с AM/PM. В немецком и французском — 24-часовой формат. В арабском используются арабско-индийские цифры, но структура времени сохраняется. Во всех локалях для долей секунды используется точка или аналогичный разделитель.
Типовые сценарии использования долей секунды
Мониторинг производительности отображает время отклика с точностью до миллисекунд.
const startTime = new Date();
// Perform operation
const endTime = new Date();
const formatter = new Intl.DateTimeFormat('en-US', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
fractionalSecondDigits: 3,
hourCycle: 'h23'
});
console.log(`Operation completed at ${formatter.format(endTime)}`);
// Output: "Operation completed at 14:23:45.678"
Это позволяет увидеть точное время завершения с точностью до миллисекунд для анализа производительности.
Для научного логирования данных требуются временные метки с долями секунды.
function logMeasurement(value) {
const timestamp = new Date();
const formatter = new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
fractionalSecondDigits: 3,
hourCycle: 'h23'
});
console.log(`${formatter.format(timestamp)} - Measurement: ${value}`);
}
logMeasurement(23.5);
// Output: "10/15/2025, 14:23:45.678 - Measurement: 23.5"
Это создаёт временные метки с точностью до миллисекунд для научных измерений.
Позиция отображения временных меток видеоплеера с точностью до долей секунды.
function formatVideoTimestamp(milliseconds) {
const date = new Date(milliseconds);
const formatter = new Intl.DateTimeFormat('en-US', {
minute: '2-digit',
second: '2-digit',
fractionalSecondDigits: 2,
hourCycle: 'h23',
timeZone: 'UTC'
});
return formatter.format(date);
}
console.log(formatVideoTimestamp(125678));
// Output: "02:05.67"
Этот формат отображает временную метку видео с точностью до сотых долей секунды. Установка часового пояса в UTC предотвращает преобразование значения длительности по часовому поясу.
Когда использовать доли секунды
Используйте доли секунды, если нужно различать события, происходящие в течение одной и той же секунды. Такая точность часто требуется для мониторинга производительности, отладки, научных измерений и медиаприложений.
Не используйте доли секунды для повседневного отображения времени. Встречи, расписания и пользовательские временные метки редко требуют точности до долей секунды. Лишняя точность усложняет восприятие времени.
Выбирайте подходящее количество знаков после запятой для своих задач. Одна цифра обеспечивает достаточную точность для большинства случаев и остаётся читаемой. Три цифры дают максимальную точность, но делают временные метки длиннее и более техническими.
Итоги
Опция fractionalSecondDigits позволяет отображать время с точностью до долей секунды. Она принимает значения 1, 2 или 3 для отображения десятых, сотых или тысячных долей секунды. При использовании fractionalSecondDigits обязательно указывайте опцию second.
В JavaScript Intl.DateTimeFormat поддерживает точность до миллисекунд, но не до микросекунд. Три знака после запятой означают миллисекунды — это максимальная доступная точность.
Доли секунды работают со всеми другими опциями форматирования времени, включая 12- и 24-часовой формат, часовые пояса и разные локали. Десятичный разделитель для долей секунды остаётся одинаковым во всех локалях.
Используйте доли секунды для мониторинга производительности, научных данных, журналов отладки и медиаметок. Избегайте их в повседневном отображении времени, где достаточно секундной точности.