Практическое руководство. Отображение миллисекунд в значениях даты и времени
Методы форматирования даты и времени по умолчанию, например DateTime.ToString(), включают часы, минуты и секунды значения времени, но исключают его компонент миллисекунд. В этой статье показано, как включить компонент миллисекунд даты и времени в форматированные строки даты и времени.
Для отображения компонента миллисекунд в значении DateTime
Если вы работаете со строковым представлением даты, преобразуйте его в DateTime значение или DateTimeOffset значение с помощью статического DateTime.Parse(String) или DateTimeOffset.Parse(String) метода.
Чтобы извлечь строковое представление миллисекундной составляющей значения времени, вызовите метод DateTime.ToString(String) или ToString у значения даты и времени, и передайте шаблон формата
fff
илиFFF
, отдельно или вместе с другими пользовательскими спецификаторами формата, в качестве параметраformat
.
Подсказка
Свойство System.Globalization.NumberFormatInfo.NumberDecimalSeparator задает разделитель миллисекунд.
Пример
В примере отображается миллисекундный компонент отдельных значений DateTime и DateTimeOffset на консоли, как по отдельности, так и в составе более длинной строки даты и времени.
using System.Globalization;
using System.Text.RegularExpressions;
string dateString = "7/16/2008 8:32:45.126 AM";
try
{
DateTime dateValue = DateTime.Parse(dateString);
DateTimeOffset dateOffsetValue = DateTimeOffset.Parse(dateString);
// Display Millisecond component alone.
Console.WriteLine($"Millisecond component only: {dateValue.ToString("fff")}");
Console.WriteLine($"Millisecond component only: {dateOffsetValue.ToString("fff")}");
// Display Millisecond component with full date and time.
Console.WriteLine($"Date and Time with Milliseconds: {dateValue.ToString("MM/dd/yyyy hh:mm:ss.fff tt")}");
Console.WriteLine($"Date and Time with Milliseconds: {dateOffsetValue.ToString("MM/dd/yyyy hh:mm:ss.fff tt")}");
string fullPattern = DateTimeFormatInfo.CurrentInfo.FullDateTimePattern;
// Create a format similar to .fff but based on the current culture.
string millisecondFormat = $"{NumberFormatInfo.CurrentInfo.NumberDecimalSeparator}fff";
// Append millisecond pattern to current culture's full date time pattern.
fullPattern = Regex.Replace(fullPattern, "(:ss|:s)", $"$1{millisecondFormat}");
// Display Millisecond component with modified full date and time pattern.
Console.WriteLine($"Modified full date time pattern: {dateValue.ToString(fullPattern)}");
Console.WriteLine($"Modified full date time pattern: {dateOffsetValue.ToString(fullPattern)}");
}
catch (FormatException)
{
Console.WriteLine($"Unable to convert {dateString} to a date.");
}
// The example displays the following output if the current culture is en-US:
// Millisecond component only: 126
// Millisecond component only: 126
// Date and Time with Milliseconds: 07/16/2008 08:32:45.126 AM
// Date and Time with Milliseconds: 07/16/2008 08:32:45.126 AM
// Modified full date time pattern: Wednesday, July 16, 2008 8:32:45.126 AM
// Modified full date time pattern: Wednesday, July 16, 2008 8:32:45.126 AM
Imports System.Globalization
Imports System.Text.REgularExpressions
Module MillisecondDisplay
Public Sub Main()
Dim dateString As String = "7/16/2008 8:32:45.126 AM"
Try
Dim dateValue As Date = Date.Parse(dateString)
Dim dateOffsetValue As DateTimeOffset = DateTimeOffset.Parse(dateString)
' Display Millisecond component alone.
Console.WriteLine("Millisecond component only: {0}", _
dateValue.ToString("fff"))
Console.WriteLine("Millisecond component only: {0}", _
dateOffsetValue.ToString("fff"))
' Display Millisecond component with full date and time.
Console.WriteLine("Date and Time with Milliseconds: {0}", _
dateValue.ToString("MM/dd/yyyy hh:mm:ss.fff tt"))
Console.WriteLine("Date and Time with Milliseconds: {0}", _
dateOffsetValue.ToString("MM/dd/yyyy hh:mm:ss.fff tt"))
Dim fullPattern As String = DateTimeFormatInfo.CurrentInfo.FullDateTimePattern
' Create a format similar to .fff but based on the current culture.
Dim millisecondFormat as String = $"{NumberFormatInfo.CurrentInfo.NumberDecimalSeparator}fff"
' Append millisecond pattern to current culture's full date time pattern.
fullPattern = Regex.Replace(fullPattern, "(:ss|:s)", $"$1{millisecondFormat}")
' Display Millisecond component with modified full date and time pattern.
Console.WriteLine("Modified full date time pattern: {0}", _
dateValue.ToString(fullPattern))
Console.WriteLine("Modified full date time pattern: {0}", _
dateOffsetValue.ToString(fullPattern))
Catch e As FormatException
Console.WriteLine("Unable to convert {0} to a date.", dateString)
End Try
End Sub
End Module
' The example displays the following output if the current culture is en-US:
' Millisecond component only: 126
' Millisecond component only: 126
' Date and Time with Milliseconds: 07/16/2008 08:32:45.126 AM
' Date and Time with Milliseconds: 07/16/2008 08:32:45.126 AM
' Modified full date time pattern: Wednesday, July 16, 2008 8:32:45.126 AM
' Modified full date time pattern: Wednesday, July 16, 2008 8:32:45.126 AM
Шаблон fff
формата включает любые конечные нули в значении миллисекунд. Шаблон FFF
формата подавляет их. В следующем примере показано различие.
DateTime dateValue = new DateTime(2008, 7, 16, 8, 32, 45, 180);
Console.WriteLine(dateValue.ToString("fff"));
Console.WriteLine(dateValue.ToString("FFF"));
// The example displays the following output to the console:
// 180
// 18
Dim dateValue As New Date(2008, 7, 16, 8, 32, 45, 180)
Console.WriteLIne(dateValue.ToString("fff"))
Console.WriteLine(dateValue.ToString("FFF"))
' The example displays the following output to the console:
' 180
' 18
Проблема с определением полного пользовательского описателя формата, включающего компонент миллисекунд в дате и времени, заключается в том, что он определяет жестко заданный формат, который может не соответствовать расположению элементов времени в текущей культуре приложения. Наиболее подходящим вариантом является получение одного из шаблонов отображения даты и времени, определенных объектом параметров текущей культуры, и его изменение для включения миллисекунд. Пример также иллюстрирует этот подход. Он извлекает полный шаблон даты и времени для текущего языка и региональных параметров из свойства DateTimeFormatInfo.FullDateTimePattern, а затем вставляет пользовательский шаблон fff
вместе с разделителем миллисекунд для текущего языка и региональных параметров. В примере используется регулярное выражение для выполнения этой операции в одном вызове метода.
Кроме того, можно использовать настраиваемый описатель формата для отображения дробной части секунд, отличной от миллисекунд. Например, спецификатор f
или F
настраиваемого формата отображает десятые доли секунды, спецификатор ff
или FF
отображает сотые доли секунды, а спецификатор ffff
или FFFF
отображает десяти тысячные доли секунды. Дробные части миллисекунды обрезаются, а не округляются, в возвращаемой строке. Эти описатели формата используются в следующем примере:
DateTime dateValue = new DateTime(2008, 7, 16, 8, 32, 45, 180);
Console.WriteLine($"{dateValue.ToString("s.f")} seconds");
Console.WriteLine($"{dateValue.ToString("s.ff")} seconds");
Console.WriteLine($"{dateValue.ToString("s.ffff")} seconds");
// The example displays the following output to the console:
// 45.1 seconds
// 45.18 seconds
// 45.1800 seconds
Dim dateValue As New DateTime(2008, 7, 16, 8, 32, 45, 180)
Console.WriteLine("{0} seconds", dateValue.ToString("s.f"))
Console.WriteLine("{0} seconds", dateValue.ToString("s.ff"))
Console.WriteLine("{0} seconds", dateValue.ToString("s.ffff"))
' The example displays the following output to the console:
' 45.1 seconds
' 45.18 seconds
' 45.1800 seconds
Примечание.
Можно отобразить очень маленькие дробные единицы секунды, такие как десять тысяч секунды или сотни тысяч секунды. Однако эти значения могут быть не значимыми. Точность значения даты и времени зависит от разрешения часов операционной системы. Дополнительные сведения см. в api, используемом операционной системой:
- Windows 7: GetSystemTimeAsFileTime
- Windows 8 и более поздних версий: GetSystemTimePreciseAsFileTime
- Linux и macOS: clock_gettime