Sdílet prostřednictvím


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

.NET poskytuje několik typů pro práci s daty data a času, které jsou optimalizované pro různé scénáře:

  • DateTime - Představuje datum a čas společně, ideální v případě, že potřebujete obě komponenty nebo při práci se starším kódem.
  • DateOnly (není k dispozici v rozhraní .NET Framework) – představuje pouze datum bez informací o čase, ideální pro narozeniny, výročí nebo obchodní data.
  • TimeOnly (není k dispozici v rozhraní .NET Framework) – představuje pouze čas bez informací o datu, ideální pro plány, alarmy nebo opakované denní události.

Každý typ poskytuje metody analýzy, které převádějí řetězce na jejich odpovídající objekty, s různými úrovněmi flexibility a kontrolu nad procesem analýzy.

Běžné koncepty analýzy

Všechny tři typy data a času sdílejí podobné přístupy k analýze:

  • Parse a TryParse metody – Převede mnoho běžných řetězcových reprezentací pomocí aktuální jazykové verze nebo zadaného nastavení jazykové verze.
  • ParseExact a TryParseExact metody - Převádějí řetězce, které odpovídají konkrétním vzorům formátu, a umožňují přesnou kontrolu nad očekávanými formáty, včetně kulturního nastavení.
  • Formátovací řetězce – Definujte vzory pro analýzu pomocí standardních nebo vlastních specifikátorů formátu.

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". Metody analýzy zpracovávají tyto varianty prostřednictvím pravidel formátování specifické pro jazykovou verzi.

Objekt DateTimeFormatInfo poskytuje kontrolu nad tím, jak má být text interpretován. Vlastnosti popisují oddělovače data a času, názvy měsíců, dnů, období a formát označení "AM" a "PM". Kulturu můžete zadat parametrem IFormatProvider pomocí objektu CultureInfo nebo objektu DateTimeFormatInfo.

Další informace o vzorech formátu naleznete v tématu standardní řetězce formátu data a času a vlastní řetězce formátu data a času.

Důležité

DateOnly a TimeOnly typy nejsou k dispozici pro rozhraní .NET Framework.

Parsování data a času

DateTime představuje společně komponenty data a času. Při převádění řetězců na DateTime objekty je potřeba zvážit několik DateTimespecifických aspektů:

  • Zpracování chybějících - DateTime informací používá výchozí hodnoty, pokud ve vstupním řetězci chybí části.
  • Podpora časových pásem a posunu UTC - DateTime může zahrnovat místní, UTC nebo nezadaná časová pásma.
  • Kombinované analýzy data a času – Musí zpracovávat komponenty data i času v jedné operaci.

Zpracování chybějících informací

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. DateTime Metody parsování tyto chybějící informace zpracovávají s využitím 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í.

Posun UTC a zpracování časového pásma

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.

Nejednoznačné zpracování dat

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.

DateTime.Parse

Následující příklad ukazuje použití DateTime.Parse metody 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.

static void DateTimeParseExample()
{
    // Parse common date and time formats using current culture
    var dateTime1 = DateTime.Parse("1/15/2025 3:30 PM");
    var dateTime2 = DateTime.Parse("January 15, 2025");
    var dateTime3 = DateTime.Parse("15:30:45");

    Console.WriteLine($"Parsed: {dateTime1}");
    Console.WriteLine($"Parsed: {dateTime2}");
    Console.WriteLine($"Parsed: {dateTime3}");

    // Parse with specific culture
    var germanDate = DateTime.Parse("15.01.2025", new CultureInfo("de-DE"));
    Console.WriteLine($"German date parsed: {germanDate}");
}
Sub DateTimeParseExample()
    ' Parse common date and time formats using current culture
    Dim dateTime1 = DateTime.Parse("1/15/2025 3:30 PM")
    Dim dateTime2 = DateTime.Parse("January 15, 2025")
    Dim dateTime3 = DateTime.Parse("15:30:45")

    Console.WriteLine($"Parsed: {dateTime1}")
    Console.WriteLine($"Parsed: {dateTime2}")
    Console.WriteLine($"Parsed: {dateTime3}")

    ' Parse with specific culture
    Dim germanDate = DateTime.Parse("15.01.2025", New CultureInfo("de-DE"))
    Console.WriteLine($"German date parsed: {germanDate}")
End Sub

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.

static void DateTimeParseGermanExample()
{
    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
}
Sub DateTimeParseGermanExample()
    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
End Sub

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í.

static void DateTimeParseNoDefaultExample()
{
    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
}
Sub DateTimeParseNoDefaultExample()
    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
End Sub

DateTime.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.

static void DateTimeParseExactExample()
{
    // Parse exact format
    var exactDate = DateTime.ParseExact("2025-01-15T14:30:00", "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
    Console.WriteLine($"Exact parse: {exactDate}");

    // Parse with custom format
    var customDate = DateTime.ParseExact("15/Jan/2025 2:30 PM", "dd/MMM/yyyy h:mm tt", CultureInfo.InvariantCulture);
    Console.WriteLine($"Custom format: {customDate}");
}
Sub DateTimeParseExactExample()
    ' Parse exact format
    Dim exactDate = DateTime.ParseExact("2025-01-15T14:30:00", "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture)
    Console.WriteLine($"Exact parse: {exactDate}")

    ' Parse with custom format
    Dim customDate = DateTime.ParseExact("15/Jan/2025 2:30 PM", "dd/MMM/yyyy h:mm tt", CultureInfo.InvariantCulture)
    Console.WriteLine($"Custom format: {customDate}")
End Sub

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í kulturu nebo objekt DateTimeFormatInfo 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.

Parsování formátu DateOnly

Struktura DateOnly představuje pouze datum bez informací o čase, takže je ideální pro scénáře, jako jsou narozeniny, výročí nebo obchodní data. Vzhledem k tomu, že nemá žádnou časovou komponentu, představuje datum od začátku dne do konce dne.

DateOnly má několik výhod oproti použití DateTime pro scénáře pouze s datem:

  • Pokud je struktura DateTime posunutá časovým pásmem, může přejít do předchozího nebo následujícího dne. DateOnly nemůže být posunut časovým pásmem a vždy představuje datum, které bylo nastaveno.
  • Serializace DateOnly zahrnuje méně dat než DateTime.
  • Když kód komunikuje s databází, jako je SQL Server, jsou všechna kalendářní data obecně uložena jako date datový typ, který nezahrnuje čas. DateOnly odpovídá lepšímu typu databáze.

DateOnly.Parse

Metoda DateOnly.Parse převede běžné řetězcové reprezentace data na objekt DateOnly. Metoda přijímá různé formáty a používá aktuální jazykovou verzi nebo zadanou jazykovou verzi k analýze.

static void DateOnlyParseExample()
{
    // Parse common date formats
    var date1 = DateOnly.Parse("1/15/2025");
    var date2 = DateOnly.Parse("January 15, 2025", CultureInfo.InvariantCulture);
    var date3 = DateOnly.Parse("2025-01-15");

    Console.WriteLine($"Parsed date: {date1}");
    Console.WriteLine($"Parsed date: {date2.ToString("D")}"); // Long date format
    Console.WriteLine($"Parsed date: {date3.ToString("yyyy-MM-dd")}");

    // Parse with specific culture
    var germanDate = DateOnly.Parse("15.01.2025", new CultureInfo("de-DE"));
    Console.WriteLine($"German date: {germanDate}");
}
Sub DateOnlyParseExample()
    ' Parse common date formats
    Dim date1 = DateOnly.Parse("1/15/2025")
    Dim date2 = DateOnly.Parse("January 15, 2025", CultureInfo.InvariantCulture)
    Dim date3 = DateOnly.Parse("2025-01-15")

    Console.WriteLine($"Parsed date: {date1}")
    Console.WriteLine($"Parsed date: {date2.ToString("D")}") ' Long date format
    Console.WriteLine($"Parsed date: {date3.ToString("yyyy-MM-dd")}")

    ' Parse with specific culture
    Dim germanDate = DateOnly.Parse("15.01.2025", New CultureInfo("de-DE"))
    Console.WriteLine($"German date: {germanDate}")
End Sub

DateOnly.ParseExact

Metoda DateOnly.ParseExact poskytuje přesnou kontrolu nad očekávaným formátem vstupního řetězce. Tuto metodu použijte, pokud znáte přesný formát řetězce kalendářního data a chcete zajistit striktní parsování.

static void DateOnlyParseExactExample()
{
    // Parse exact format
    var exactDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture);
    Console.WriteLine($"Exact date: {exactDate}");

    // Parse ISO format
    var isoDate = DateOnly.ParseExact("2025-01-15", "yyyy-MM-dd", CultureInfo.InvariantCulture);
    Console.WriteLine($"ISO date: {isoDate}");

    // Parse with multiple possible formats
    string[] formats = { "MM/dd/yyyy", "M/d/yyyy", "dd/MM/yyyy" };
    var flexibleDate = DateOnly.ParseExact("1/15/2025", formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
    Console.WriteLine($"Flexible parse: {flexibleDate}");
}
Sub DateOnlyParseExactExample()
    ' Parse exact format
    Dim exactDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture)
    Console.WriteLine($"Exact date: {exactDate}")

    ' Parse ISO format
    Dim isoDate = DateOnly.ParseExact("2025-01-15", "yyyy-MM-dd", CultureInfo.InvariantCulture)
    Console.WriteLine($"ISO date: {isoDate}")

    ' Parse with multiple possible formats
    Dim formats() As String = {"MM/dd/yyyy", "M/d/yyyy", "dd/MM/yyyy"}
    Dim flexibleDate = DateOnly.ParseExact("1/15/2025", formats, CultureInfo.InvariantCulture, DateTimeStyles.None)
    Console.WriteLine($"Flexible parse: {flexibleDate}")
End Sub

Metoda ParseExact přijímá buď jeden formátovací řetězec, nebo pole formátových řetězců, což umožňuje analyzovat kalendářní data, která můžou být v několika přijatelných formátech.

Parsování TimeOnly

Struktura TimeOnly představuje denní hodnotu, například denní budík nebo čas, kdy každý den sníte oběd. TimeOnly je omezena na rozsah 00:00:00.000000 - 23:59:59.999999999, určitý čas dne.

TimeOnly řeší několik problémů, které existovaly při použití jiných typů pro scénáře týkající se pouze času:

  • TimeSpan představuje uplynulý čas a může být záporný nebo delší než 24 hodin, takže není vhodný pro reprezentaci konkrétního dne.
  • Použití DateTime pro čas dne vyžaduje libovolné datum, které může vést k neočekávanému chování při provádění výpočtů.
  • TimeOnly automaticky zpracovává přechod přes 24hodin při sčítání nebo odčítání časových hodnot.

TimeOnly.Parse

Metoda TimeOnly.Parse převede běžné řetězcové reprezentace času na TimeOnly objekt. Metoda přijímá různé formáty včetně 12hodinového a 24hodinového formátu.

static void TimeOnlyParseExample()
{
    // Parse common time formats
    var time1 = TimeOnly.Parse("14:30:15");
    var time2 = TimeOnly.Parse("2:30 PM", CultureInfo.InvariantCulture);
    var time3 = TimeOnly.Parse("17:45");

    Console.WriteLine($"Parsed time: {time1}");
    Console.WriteLine($"Parsed time: {time2.ToString("t")}"); // Short time format
    Console.WriteLine($"Parsed time: {time3.ToString("HH:mm")}");

    // Parse with milliseconds
    var preciseTime = TimeOnly.Parse("14:30:15.123");
    Console.WriteLine($"Precise time: {preciseTime.ToString("HH:mm:ss.fff")}");
}
Sub TimeOnlyParseExample()
    ' Parse common time formats
    Dim time1 = TimeOnly.Parse("14:30:15")
    Dim time2 = TimeOnly.Parse("2:30 PM", CultureInfo.InvariantCulture)
    Dim time3 = TimeOnly.Parse("17:45")

    Console.WriteLine($"Parsed time: {time1}")
    Console.WriteLine($"Parsed time: {time2.ToString("t")}") ' Short time format
    Console.WriteLine($"Parsed time: {time3.ToString("HH:mm")}")

    ' Parse with milliseconds
    Dim preciseTime = TimeOnly.Parse("14:30:15.123")
    Console.WriteLine($"Precise time: {preciseTime.ToString("HH:mm:ss.fff")}")
End Sub

TimeOnly.ParseExact

Metoda TimeOnly.ParseExact poskytuje přesnou kontrolu nad očekávaným formátem vstupního časového řetězce. Tuto metodu použijte, pokud znáte přesný formát a chcete zajistit striktní analýzu.

static void TimeOnlyParseExactExample()
{
    // Parse exact format
    var exactTime = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture);
    Console.WriteLine($"Exact time: {exactTime}");

    // Parse 24-hour format
    var militaryTime = TimeOnly.ParseExact("17:30:25", "HH:mm:ss", CultureInfo.InvariantCulture);
    Console.WriteLine($"Military time: {militaryTime}");

    // Parse with multiple possible formats
    string[] timeFormats = { "h:mm tt", "HH:mm", "H:mm" };
    var flexibleTime = TimeOnly.ParseExact("2:30 PM", timeFormats, CultureInfo.InvariantCulture, DateTimeStyles.None);
    Console.WriteLine($"Flexible time parse: {flexibleTime}");
}
Sub TimeOnlyParseExactExample()
    ' Parse exact format
    Dim exactTime = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture)
    Console.WriteLine($"Exact time: {exactTime}")

    ' Parse 24-hour format
    Dim militaryTime = TimeOnly.ParseExact("17:30:25", "HH:mm:ss", CultureInfo.InvariantCulture)
    Console.WriteLine($"Military time: {militaryTime}")

    ' Parse with multiple possible formats
    Dim timeFormats() As String = {"h:mm tt", "HH:mm", "H:mm"}
    Dim flexibleTime = TimeOnly.ParseExact("2:30 PM", timeFormats, CultureInfo.InvariantCulture, DateTimeStyles.None)
    Console.WriteLine($"Flexible time parse: {flexibleTime}")
End Sub

Viz také