Sdílet prostřednictvím


Postupy: Zobrazení milisekund v hodnotách data a času

Výchozí metody formátování data a času, například DateTime.ToString(), zahrnují hodiny, minuty a sekundy časové hodnoty, ale vylučují jeho komponentu milisekund. Tento článek ukazuje, jak zahrnout komponentu data a času v milisekundách do formátovaných řetězců data a času.

Je třeba zobrazit komponentu milisekund hodnoty DateTime

  1. Pokud pracujete s řetězcovou reprezentací data, převeďte ji na DateTime nebo hodnotu DateTimeOffset pomocí statické DateTime.Parse(String) nebo DateTimeOffset.Parse(String) metody.

  2. Chcete-li získat řetězcovou reprezentaci milisekundové složky času, zavolejte metodu DateTime.ToString(String) nebo ToString pro hodnotu data a času a jako parametr format předejte vlastní formát fff nebo FFF, buď samostatně, nebo s dalšími specifikátory vlastního formátu.

Návod

Vlastnost System.Globalization.NumberFormatInfo.NumberDecimalSeparator určuje oddělovač milisekund.

Příklad

V příkladu se na konzoli zobrazí milisekundová komponenta hodnoty DateTime a hodnota DateTimeOffset, a to jak samostatně, tak jako součást delšího formátu 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: {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

Vzor formátu fff zahrnuje všechny koncové nuly v milisekundové hodnotě. Formátovací vzor FFF je potlačuje. 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 definovaných objektem DateTimeFormatInfo aktuální jazykové verze a upravit ho tak, aby zahrnoval milisekundy. Tento přístup ilustruje také tento příklad. Načte plný vzorek data a času aktuální kultury z vlastnosti DateTimeFormatInfo.FullDateTimePattern a potom vloží vlastní vzorek fff spolu s oddělovačem milisekund aktuální kultury. V příkladu se k provedení této operace používá regulární výraz v jednom volání metody.

Můžete také použít specifikátor vlastního formátu k zobrazení zlomkové části sekund kromě milisekund. Například specifikátor vlastního formátu f nebo F zobrazí desetiny sekundy, specifikátor ff nebo FF vlastního formátu zobrazí setiny sekundy a specifikátor ffff nebo FFFF vlastní formát zobrazí desetitisíce sekundy. Zlomkové části milisekundy se ve vráceném řetězci odřezávají místo zaokrouhlení. 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($"{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

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á:

Viz také