Instrukcje: wyświetlanie milisekund w wartościach daty i godziny

Domyślne metody formatowania daty i czasu, takie jak DateTime.ToString(), zawierają godziny, minuty i sekundy wartości czasu, ale wykluczają składnik milisekund. W tym artykule pokazano, jak uwzględnić składnik daty i godziny w sformatowanych ciągach daty i godziny.

Aby wyświetlić składnik milisekund wartości DateTime

  1. Jeśli pracujesz z reprezentacją ciągu daty, przekonwertuj ją na DateTime wartość lub DateTimeOffset przy użyciu metody lub statycznejDateTime.Parse(String).DateTimeOffset.Parse(String)

  2. Aby wyodrębnić ciąg reprezentujący składnik milisekundowy godziny, wywołaj metodę lub wartość DateTime.ToString(String) daty i godziny, a następnie przekaż fff sam wzorzec formatu niestandardowego lub FFF z innymi specyfikatorami formatu niestandardowego jako parametru formatToString.

Napiwek

Właściwość System.Globalization.NumberFormatInfo.NumberDecimalSeparator określa separator milisekund.

Przykład

W przykładzie przedstawiono składnik milisekund wartości i DateTimeDateTimeOffset dla konsoli, sam i uwzględniony w dłuższym ciągu daty i godziny.

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

Wzorzec formatu fff zawiera dowolne zera końcowe w wartościach milisekund. Wzorzec formatu FFF pomija je. Poniższy przykład ilustruje różnicę:

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

Problem z definiowaniem pełnego specyfikatora formatu niestandardowego, który zawiera składnik milisekund daty i godziny, polega na tym, że definiuje zakodowany format, który może nie odpowiadać układowi elementów czasu w bieżącej kulturze aplikacji. Lepszą alternatywą jest pobranie jednej daty i czasu wyświetlającej wzorzec określony przez obiekt bieżącej kultury DateTimeFormatInfo i zmodyfikować go, aby uwzględniał milisekundy. Ten przykład ilustruje takie podejście. Pobiera wzorzec daty i godziny bieżącej kultury z DateTimeFormatInfo.FullDateTimePattern właściwości , a następnie wstawia wzorzec fff niestandardowy wraz z separatorem milisekund bieżącej kultury. W przykładzie użyto wyrażenia regularnego do wykonania tej operacji w ramach pojedynczego wywołania metody.

Aby wyświetlić część ułamkową sekund innych niż milisekund można określić specyfikator formatu niestandardowego. Na przykład f specyfikator formatu niestandardowego lub F wyświetla dziesiąte części sekundy, ff specyfikator formatu niestandardowego lub FF wyświetla setne części sekundy, a ffff specyfikator formatu niestandardowego lub FFFF wyświetla dziesięć tysięcznych części sekundy. Części ułamkowe milisekund są obcinane w zwracanym ciągu zamiast zaokrąglane. Te specyfikatory formatu są używane w poniższym przykładzie:

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

Uwaga

Można wyświetlić bardzo małe jednostki ułamkowe sekundy, takie jak dziesięć tysięcznych części sekundy lub setek tysięcy sekundy. Jednak te wartości mogą nie być znaczące. Precyzja wartości daty i godziny zależy od rozdzielczości zegara systemu operacyjnego. Aby uzyskać więcej informacji, zobacz interfejs API używany przez system operacyjny:

Zobacz też