Analýza řetězců data a času v .NET

Analýza řetězců pro převod na DateTime objekty vyžaduje, abyste zadali informace o tom, jak jsou kalendářní data a časy reprezentovány jako text. Různé jazykové verze používají různé objednávky pro den, měsíc a rok. Některé časové reprezentace používají 24hodinový formát, jiné určují "AM" a "PM". Některé aplikace potřebují jenom datum. Ostatní potřebují jenom čas. Ostatní musí zadat datum i čas. Metody, které převádějí řetězce na DateTime objekty, umožňují poskytnout podrobné informace o očekávaných formátech a prvcích data a času, které vaše aplikace potřebuje. Existují tři dílčí úkoly, které správně převedou text na DateTime:

  1. Je nutné zadat očekávaný formát textu představujícího datum a čas.
  2. Jazykovou verzi můžete zadat pro formát data a času.
  3. Můžete určit, jak se chybějící součásti v textové reprezentaci nastaví v datu a čase.

Tyto Parse metody TryParse převádějí mnoho běžných reprezentací data a času. TryParseExact A ParseExact metody převedou řetězcovou reprezentaci, která odpovídá vzoru určenému řetězcem formátu data a času. Další informace najdete v článcích o standardních řetězcích formátu data a času a vlastních řetězcích formátu data a času.

Aktuální DateTimeFormatInfo objekt poskytuje větší kontrolu nad tím, jak má být text interpretován jako datum a čas. DateTimeFormatInfo Vlastnosti oddělovače data a času, názvy měsíců, dnů a období a formát označení "AM" a "PM". Vráceno CultureInfoCultureInfo.CurrentCultureCultureInfo.DateTimeFormat vlastnost, která představuje aktuální jazykovou verzi. Pokud chcete konkrétní jazykovou verzi nebo vlastní nastavení, zadejte IFormatProvider parametr metody analýzy. IFormatProvider Pro parametr zadejte CultureInfo objekt, který představuje jazykovou verzi nebo DateTimeFormatInfo objekt.

V textu představujícím datum nebo čas můžou chybět některé informace. Většina lidí například předpokládá, že datum "12. března" představuje aktuální rok. Podobně "březen 2018" představuje měsíc březen v roce 2018. Text představující čas často zahrnuje pouze hodiny, minuty a označení AM/PM. Metody analýzy zpracovávají tyto chybějící informace pomocí přiměřených výchozích hodnot:

  • Pokud je k dispozici pouze čas, použije část s datem aktuální datum.
  • Pokud je k dispozici pouze datum, časová část je půlnoc.
  • Pokud rok není zadaný v datu, použije se aktuální rok.
  • Pokud není zadaný den v měsíci, použije se první den v měsíci.

Pokud je datum v řetězci, musí obsahovat měsíc a jeden den nebo rok. Pokud je čas k dispozici, musí obsahovat hodinu a buď minuty, nebo návrh AM/PM.

Můžete zadat konstantu NoCurrentDateDefault , která má tyto výchozí hodnoty přepsat. Pokud použijete tuto konstantu, všechny chybějící vlastnosti roku, měsíce nebo dne jsou nastaveny na hodnotu 1. Poslední příklad použití Parse ukazuje toto chování.

Kromě komponenty data a času může řetězcová reprezentace data a času zahrnovat posun, který označuje, kolik času se liší od koordinovaného univerzálního času (UTC). Například řetězec "2/14/2007 5:32:00 -7:00" definuje čas, který je sedm hodin dřívější než UTC. Pokud je posun vynechán z řetězcové reprezentace času, parsování vrátí DateTime objekt s jeho Kind vlastností nastavenou na DateTimeKind.Unspecified. Pokud je zadán posun, parsování vrátí DateTime objekt s jeho Kind vlastností nastavenou na DateTimeKind.Local. Jeho hodnota se také upraví na místní časové pásmo vašeho počítače. Toto chování můžete upravit pomocí DateTimeStyles hodnoty s metodou analýzy.

Zprostředkovatel formátu slouží také k interpretaci nejednoznačného číselného data. Není jasné, které součásti data reprezentované řetězcem 02/03/04 jsou měsíc, den a rok. Komponenty jsou interpretovány podle pořadí podobných formátů kalendářních dat ve zprostředkovateli formátu.

Rozložit

Následující příklad znázorňuje použití DateTime.Parse metody k převodu na string .DateTime Tento příklad používá jazykovou verzi přidruženou k aktuálnímu vláknu. Pokud přidružená CultureInfo k aktuální jazykové verzi nemůže analyzovat vstupní řetězec, FormatException vyvolá se chyba.

Tip

Všechny ukázky jazyka C# v tomto článku se spouštějí v prohlížeči. Stisknutím tlačítka Spustit zobrazíte výstup. Můžete je také upravit a experimentovat sami.

Poznámka:

Tyto příklady jsou k dispozici v úložišti dokumentace GitHubu pro 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

Můžete také explicitně definovat jazykovou verzi, jejíž konvence formátování se používají při analýze řetězce. Zadáte jeden ze standardních DateTimeFormatInfo objektů vrácených CultureInfo.DateTimeFormat vlastností. Následující příklad používá zprostředkovatele formátu k analýze německého řetězce do .DateTime Vytvoří reprezentaci CultureInfode-DE jazykové verze. Tento CultureInfo objekt zajišťuje úspěšnou analýzu tohoto konkrétního řetězce. Tento proces vylučuje jakékoli nastavení v CurrentCulture oblasti 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

Přetížení metody však můžete použít k určení zprostředkovatelů vlastního Parse formátu. Metoda Parse nepodporuje analýzu nestandardních formátů. K analýze data a času vyjádřeného v nestandardním formátu použijte metodu ParseExact .

Následující příklad používá DateTimeStyles výčet k určení, že aktuální informace o datu a čase by neměly být přidány do DateTime nezadaných polí.

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 převede řetězec na DateTime objekt, pokud odpovídá jednomu ze zadaných řetězců vzorů. Pokud je do této metody předán řetězec, který není jedním ze zadaných formulářů, FormatException vyvolá se. Můžete zadat jeden ze standardních specifikátorů formátu data a času nebo kombinaci specifikátorů vlastního formátu. Pomocí specifikátorů vlastního formátu je možné vytvořit vlastní řetězec rozpoznávání. Vysvětlení specifikátorů najdete v článcích o standardních řetězcích formátu data a času a vlastních řetězců formátu data a času.

V následujícím příkladu DateTime.ParseExact se metodě předá objekt řetězce, který se má parsovat, následovaný specifikátorem formátu následovaným objektem CultureInfo . Tato ParseExact metoda může analyzovat pouze řetězce, které se řídí dlouhým vzorem kalendářních dat v jazykové verzi en-US .

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ždé přetížení Parse a ParseExact metody má IFormatProvider také parametr, který poskytuje informace specifické pro jazykovou verzi o formátování řetězce. Objekt IFormatProvider je CultureInfo objekt, který představuje standardní jazykovou verzi nebo DateTimeFormatInfo objekt, který je vrácen vlastností CultureInfo.DateTimeFormat . ParseExact používá také další řetězcový nebo řetězcový maticový argument, který definuje jeden nebo více vlastních formátů data a času.

Viz také