Anvisningar: Visa millisekunder i datum- och tidsvärden

Standardmetoderna för datum- och tidsformatering, till exempel DateTime.ToString(), inkluderar timmar, minuter och sekunder för ett tidsvärde, men exkluderar dess millisekunderskomponent. Den här artikeln visar hur du inkluderar en datum- och tids millisekunderskomponent i formaterade datum- och tidssträngar.

Så här visar du millisekunderskomponenten för ett DateTime-värde

  1. Om du arbetar med strängrepresentationen av ett datum konverterar du det till ett DateTime värde eller ett DateTimeOffset värde med hjälp av den statiska DateTime.Parse(String) metoden eller DateTimeOffset.Parse(String) metoden.

  2. Om du vill extrahera strängrepresentationen av en tids millisekunderskomponent anropar du datum- och tidsvärdet DateTime.ToString(String) eller ToString metoden och skickar fff mönstret eller FFF det anpassade formatmönstret ensamt eller med andra anpassade formatspecificerare som format parameter.

Dricks

Egenskapen System.Globalization.NumberFormatInfo.NumberDecimalSeparator anger millisekundersavgränsaren.

Exempel

Exemplet visar millisekunderskomponenten i en DateTime och ett DateTimeOffset värde för konsolen, ensam och ingår i en längre datum- och tidssträng.

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

Formatmönstret fff innehåller eventuella avslutande nollor i millisekundersvärdet. Formatmönstret FFF undertrycker dem. I följande exempel visas skillnaden:

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

Ett problem med att definiera en fullständig anpassad formatspecificerare som innehåller millisekunderskomponenten för ett datum och en tid är att det definierar ett hårdkodat format som kanske inte motsvarar ordningen för tidselement i programmets aktuella kultur. Ett bättre alternativ är att hämta ett av de datum- och tidsvisningsmönster som definieras av den aktuella kulturens DateTimeFormatInfo objekt och ändra det så att det innehåller millisekunder. Exemplet illustrerar också den här metoden. Den hämtar den aktuella kulturens fullständiga datum- och tidsmönster från DateTimeFormatInfo.FullDateTimePattern egenskapen och infogar sedan det anpassade mönstret fff tillsammans med den aktuella kulturens millisekundersavgränsare. I exemplet används ett reguljärt uttryck för att utföra den här åtgärden i ett enda metodanrop.

Du kan också använda en anpassad formatspecificerare för att visa en bråkdels del av andra sekunder än millisekunder. Till exempel f visar eller F anpassad formatspecificerare tiondelar av en sekund, ff eller FF anpassad formatspecificerare hundradelar av en sekund, och ffff eller FFFF anpassad formatspecificerare visar tio tusendelar av en sekund. Delar av en millisekunder trunkeras i stället för avrundade i den returnerade strängen. Dessa formatspecificerare används i följande exempel:

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

Kommentar

Det är möjligt att visa mycket små bråkenheter på en sekund, till exempel tio tusendelar av en sekund eller hundratusendels sekund. Dessa värden kanske dock inte är meningsfulla. Precisionen för ett datum- och tidsvärde beror på operativsystemets klockas upplösning. Mer information finns i API:et som ditt operativsystem använder:

Se även