Sdílet prostřednictvím


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é kultury používají různé pořadí 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. Můžete určit kulturu pro formát data a času.
  3. Můžete určit, jak nastavit chybějící součásti v textové reprezentaci data a času.

Tyto metody Parse a 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ácený CultureInfo od CultureInfo.CurrentCulture má vlastnost CultureInfo.DateTimeFormat, která představuje aktuální jazykovou verzi. Pokud chcete konkrétní kulturní nastavení nebo vlastní nastavení, zadejte parametr IFormatProvider metody parsování. Pro parametr IFormatProvider zadejte objekt CultureInfo, který představuje kulturní nastavení, nebo objekt DateTimeFormatInfo.

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 uveden čas, musí obsahovat hodinu a buď minuty, nebo označení AM/PM.

Můžete zadat konstantu NoCurrentDateDefault, která tyto výchozí hodnoty přepíše. 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 časový posun vynechán z řetězcové reprezentace času, parsování vrátí DateTime objekt s jeho vlastností Kind, která je nastavena 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í hodnoty DateTimeStyles s analytickou metodou.

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ů dat ve zprostředkovateli formátu.

Analyzovat

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

Návod

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 kulturu, jejíž konvence formátování se používají při parsování řetězce. Zadáte jeden ze standardních DateTimeFormatInfo objektů vrácených CultureInfo.DateTimeFormat vlastností. Následující příklad používá formátového poskytovatele k analýze německého řetězce do DateTime. Vytvoří CultureInfo, která reprezentuje kulturu de-DE. 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 můžete však použít k určení vlastních zprostředkovatelů formátu Parse. 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é odpovídají dlouhému formátu data v kultuře 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 '{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á verze přetížení metod Parse a ParseExact má také parametr IFormatProvider, který poskytuje informace specifické pro kulturu o formátování řetězce. Objekt IFormatProvider je objekt CultureInfo, který představuje standardní jazykovou verzi, nebo objekt DateTimeFormatInfo, který je vrácen vlastností CultureInfo.DateTimeFormat. ParseExact také využívá další argument, který je buď řetězec nebo pole řetězců, a definuje jeden nebo více vlastních formátů data a času.

Viz také