Postupy: Zobrazení milisekund v hodnotách data a času
Výchozí metody pro formátování hodnot data a času, jako například DateTime.ToString(), zahrnují hodiny, minuty a sekundy příslušné časové hodnoty, ale neobsahují komponentu milisekund. Tento článek ukazuje, jak zahrnout komponentu data a času v milisekundách do formátovaných řetězců data a času.
Zobrazení komponenty milisekund hodnoty DateTime
Pokud pracujete s řetězcovou reprezentací data, převeďte ho na DateTime hodnotu pomocí DateTimeOffset statické DateTime.Parse(String) nebo DateTimeOffset.Parse(String) metody.
Chcete-li extrahovat řetězcovou reprezentaci komponenty milisekund času, zavolejte hodnotu data a času nebo DateTime.ToString(String)ToString metodu a předejte
fff
FFF
samotný vzor vlastního formátu nebo s jinými specifikátory vlastního formátu jakoformat
parametr.
Tip
Vlastnost System.Globalization.NumberFormatInfo.NumberDecimalSeparator určuje oddělovač milisekund.
Příklad
V příkladu se zobrazí komponenta milisekund a DateTimeDateTimeOffset hodnoty konzoly, která je samostatně a zahrnuta v delším řetězci data a času.
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: {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"));
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: {0}",
dateValue.ToString(fullPattern));
Console.WriteLine("Modified full date time pattern: {0}",
dateOffsetValue.ToString(fullPattern));
}
catch (FormatException)
{
Console.WriteLine("Unable to convert {0} to a date.", dateString);
}
// 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
Vzor formátu fff
zahrnuje všechny koncové nuly v hodnotě milisekund. Vzor formátu FFF
je potlačí. Následující příklad znázorňuje rozdíl:
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
Problém s definováním kompletního specifikátoru vlastního formátu, který zahrnuje komponentu milisekund data a času, je, že definuje pevně zakódovaný formát, který nemusí odpovídat uspořádání časových prvků v aktuální jazykové verzi aplikace. Lepší alternativou je načíst jeden ze vzorů zobrazení data a času, které jsou definovány v objektu aktuální jazykové verze DateTimeFormatInfo, a upravit je tak, aby milisekundy obsahovaly. Tento příklad znázorňuje také tento přístup. Načte z vlastnosti vzor DateTimeFormatInfo.FullDateTimePattern úplného data a času aktuální jazykové verze a potom vloží vlastní vzor fff
spolu s oddělovačem milisekund aktuální jazykové verze. V příkladu se k provedení této operace používá regulární výraz v jednom volání metody.
Pro zobrazení jiné části sekundového údaje než milisekund lze použít také specifikátor vlastního formátu. Specifikátor vlastního formátu například f
F
zobrazuje desetiny sekundy, ff
FF
specifikátor vlastního formátu zobrazí setiny sekundy a ffff
specifikátor vlastního formátu nebo FFFF
specifikátor vlastního formátu zobrazí desetitisíce sekundy. Zlomkové části milisekundy jsou ve vráceném řetězci namísto zaokrouhlení zkráceny. Tyto specifikátory formátu se používají v následujícím příkladu:
DateTime dateValue = 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
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
Poznámka:
Je možné zobrazit velmi malé desetinné jednotky sekundy, například desetitisíce sekundy nebo stotisíce sekundy. Tyto hodnoty ale nemusí být smysluplné. Přesnost hodnoty data a času závisí na rozlišení hodin operačního systému. Další informace najdete v rozhraní API, které váš operační systém používá:
- Windows 7: GetSystemTimeAsFileTime
- Windows 8 a novější: GetSystemTimePreciseAsFileTime
- Linux a macOS: clock_gettime