Analizowanie ciągów daty i godziny na platformie .NET

Analizowanie ciągów w celu przekonwertowania ich na DateTime obiekty wymaga określenia informacji o tym, jak daty i godziny są reprezentowane jako tekst. Różne kultury używają różnych zamówień na dzień, miesiąc i rok. Niektóre reprezentacje czasu używają zegara 24-godzinnego, inne określają "AM" i "PM". Niektóre aplikacje potrzebują tylko daty. Inni potrzebują tylko czasu. Nadal inne muszą określić zarówno datę, jak i godzinę. Metody konwertujące ciągi na DateTime obiekty umożliwiają podanie szczegółowych informacji na temat oczekiwanych formatów oraz elementów daty i godziny potrzeb aplikacji. Istnieją trzy podzadania do poprawnego konwertowania tekstu na :DateTime

  1. Należy określić oczekiwany format tekstu reprezentującego datę i godzinę.
  2. Możesz określić kulturę dla formatu daty i godziny.
  3. Możesz określić, w jaki sposób brakujące składniki w reprezentacji tekstu są ustawiane w dacie i godzinie.

Metody Parse i TryParse konwertują wiele typowych reprezentacji daty i godziny. Metody ParseExact i TryParseExact konwertują reprezentację ciągu zgodną ze wzorcem określonym przez ciąg formatu daty i godziny. Aby uzyskać więcej informacji, zobacz artykuły dotyczące standardowych ciągów formatu daty i godziny oraz niestandardowych ciągów formatu daty i godziny.

Bieżący DateTimeFormatInfo obiekt zapewnia większą kontrolę nad sposobem interpretowania tekstu jako daty i godziny. DateTimeFormatInfo Właściwości opisujące separatory daty i godziny, nazwy miesięcy, dni i ery oraz format oznaczeń "AM" i "PM". Zwrócony CultureInfo przez CultureInfo.CurrentCulture element ma właściwość reprezentującą bieżącą CultureInfo.DateTimeFormat kulturę. Jeśli chcesz użyć określonej kultury lub ustawień niestandardowych, określ IFormatProvider parametr metody analizowania. Dla parametru IFormatProvider określ CultureInfo obiekt, który reprezentuje kulturę DateTimeFormatInfo lub obiekt.

Tekst reprezentujący datę lub godzinę może nie zawierać niektórych informacji. Na przykład większość osób zakłada, że data "12 marca" reprezentuje bieżący rok. Podobnie "Marzec 2018" reprezentuje miesiąc marca w roku 2018. Tekst reprezentujący czas często zawiera tylko godziny, minuty i oznaczenie AM/PM. Metody analizowania obsługują brakujące informacje przy użyciu rozsądnych wartości domyślnych:

  • Gdy tylko godzina jest obecna, część daty używa bieżącej daty.
  • Gdy jest obecna tylko data, część czasu to północ.
  • Gdy rok nie jest określony w dacie, jest używany bieżący rok.
  • Gdy dzień miesiąca nie jest określony, używany jest pierwszy dzień miesiąca.

Jeśli data jest obecna w ciągu, musi zawierać miesiąc i jeden dzień lub rok. Jeśli czas jest obecny, musi zawierać godzinę i minuty lub projektant AM/PM.

Możesz określić stałą NoCurrentDateDefault , aby zastąpić te wartości domyślne. Jeśli używasz tej stałej, wszystkie brakujące właściwości roku, miesiąca lub dnia są ustawione na wartość 1. Ostatni przykład użycia Parse demonstruje to zachowanie.

Oprócz składnika daty i godziny ciąg reprezentujący datę i godzinę może zawierać przesunięcie wskazujące, ile czasu różni się od uniwersalnego czasu koordynowanego (UTC). Na przykład ciąg "2/14/2007 5:32:00 -7:00" definiuje czas, który wynosi siedem godzin wcześniej niż UTC. Jeśli przesunięcie zostanie pominięte z ciągu reprezentacji czasu, analizowanie zwraca DateTime obiekt z jego Kind właściwością ustawioną na DateTimeKind.Unspecifiedwartość . Jeśli określono przesunięcie, analizowanie zwraca DateTime obiekt z jego Kind właściwością ustawioną na DateTimeKind.Localwartość . Jego wartość jest również dostosowywana do lokalnej strefy czasowej maszyny. To zachowanie można zmodyfikować przy użyciu DateTimeStyles wartości metody analizowania.

Dostawca formatu służy również do interpretowania niejednoznacznej daty liczbowej. Nie jest jasne, które składniki daty reprezentowane przez ciąg "02/03/04" są miesiącem, dniem i rokiem. Składniki są interpretowane zgodnie z kolejnością podobnych formatów dat u dostawcy formatu.

Analizuj

W poniższym przykładzie pokazano użycie DateTime.Parse metody w celu przekonwertowania string obiektu na element DateTime. W tym przykładzie użyto kultury skojarzonej z bieżącym wątkiem. CultureInfo Jeśli skojarzony z bieżącą kulturą nie może przeanalizować ciągu wejściowego, FormatException zostanie zgłoszony element .

Napiwek

Wszystkie przykłady języka C# w tym artykule są uruchamiane w przeglądarce. Naciśnij przycisk Uruchom, aby wyświetlić dane wyjściowe. Można je również edytować, aby samodzielnie eksperymentować.

Uwaga

Te przykłady są dostępne w repozytorium dokumentacji usługi GitHub dla języka C# i Visual Basic.

string dateInput = "Jan 1, 2009";
var parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 00:00:00
Dim MyString As String = "Jan 1, 2009"
Dim MyDateTime As DateTime = DateTime.Parse(MyString)
Console.WriteLine(MyDateTime)
' Displays the following output on a system whose culture is en-US:
'       1/1/2009 00:00:00

Można również jawnie zdefiniować kulturę, której konwencje formatowania są używane podczas analizowania ciągu. Należy określić jeden ze standardowych DateTimeFormatInfo obiektów zwracanych przez CultureInfo.DateTimeFormat właściwość . W poniższym przykładzie użyto dostawcy formatu, aby przeanalizować ciąg niemiecki w obiekcie DateTime. Tworzy on reprezentację CultureInfode-DE kultury. Ten CultureInfo obiekt zapewnia pomyślne analizowanie tego określonego ciągu. Ten proces uniemożliwia określenie, jakie ustawienie znajduje się w CurrentCulture obiekcie CurrentThread.

var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo);
Console.WriteLine(dateTime);
// The example displays the following output:
//       6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
Console.WriteLine(MyDateTime)
' The example displays the following output:
'       6/12/2008 00:00:00

Można jednak użyć przeciążeń Parse metody, aby określić niestandardowych dostawców formatów. Metoda Parse nie obsługuje analizowania niestandardowych formatów. Aby przeanalizować datę i godzinę wyrażoną w formacie niestandardowym, użyj ParseExact metody .

W poniższym przykładzie DateTimeStyles użyto wyliczenia, aby określić, że bieżące informacje o dacie i godzinie nie powinny być dodawane do DateTime pól nieokreślonych.

var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo,
                                DateTimeStyles.NoCurrentDateDefault);
Console.WriteLine(dateTime);
// The example displays the following output if the current culture is en-US:
//      6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo,
                           DateTimeStyles.NoCurrentDateDefault)
Console.WriteLine(MyDateTime)
' The example displays the following output if the current culture is en-US:
'       6/12/2008 00:00:00

Parseexact

Metoda DateTime.ParseExact konwertuje ciąg na DateTime obiekt, jeśli jest zgodny z jednym z określonych wzorców ciągów. Gdy ciąg, który nie jest jedną z określonych formularzy, jest przekazywany do tej metody, FormatException jest zgłaszany. Można określić jeden ze standardowych specyfikatorów formatu daty i godziny lub kombinację specyfikatorów formatu niestandardowego. Za pomocą specyfikatorów formatu niestandardowego można utworzyć niestandardowy ciąg rozpoznawania. Aby uzyskać wyjaśnienie specyfikatorów, zobacz artykuły dotyczące standardowych ciągów formatu daty i godziny oraz niestandardowych ciągów formatu daty i godziny.

W poniższym przykładzie DateTime.ParseExact metoda jest przekazywana do analizy obiektu ciągu, a następnie specyfikatora formatu, a następnie CultureInfo obiektu. Ta ParseExact metoda może analizować tylko ciągi, które są zgodne ze wzorcem daty długiej en-US w kulturze.

var cultureInfo = new CultureInfo("en-US");
string[] dateStrings = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in dateStrings)
{
    try
    {
        var dateTime = DateTime.ParseExact(dateString, "D", cultureInfo);
        Console.WriteLine(dateTime);
    }
    catch (FormatException)
    {
        Console.WriteLine("Unable to parse '{0}'", dateString);
    }
}
// The example displays the following output:
//       Unable to parse ' Friday, April 10, 2009'
//       4/10/2009 00:00:00
Dim MyCultureInfo As New CultureInfo("en-US")
Dim MyString() As String = {" Friday, April 10, 2009", "Friday, April 10, 2009"}
For Each dateString As String In MyString
    Try
        Dim MyDateTime As DateTime = DateTime.ParseExact(dateString, "D",
                                                     MyCultureInfo)
        Console.WriteLine(MyDateTime)
    Catch e As FormatException
        Console.WriteLine("Unable to parse '{0}'", dateString)
    End Try
Next
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 00:00:00

Każde przeciążenie Parse metod i ParseExact zawiera IFormatProvider również parametr, który udostępnia informacje specyficzne dla kultury dotyczące formatowania ciągu. Obiekt IFormatProvider jest obiektem reprezentującym CultureInfo standardową kulturę lub DateTimeFormatInfo obiekt zwracany przez CultureInfo.DateTimeFormat właściwość . ParseExact Używa również dodatkowego argumentu ciągu lub tablicy ciągów, który definiuje co najmniej jeden niestandardowy format daty i godziny.

Zobacz też