Analizowanie ciągów daty i godziny w programie .NETParsing Date and Time Strings in .NET

Analizowanie ciągów w celu przekonwertowania ich do obiektów DateTime wymaga określenia informacji o tym, jak daty i godziny są reprezentowane jako tekst.Parsing strings to convert them to DateTime objects requires you to specify information about how the dates and times are represented as text. Różne kultury używają różnej kolejności dla dnia, miesiąca i roku.Different cultures use different orders for day, month, and year. Niektóre reprezentacje czasu używają zegara 24-godzinnego, inne określają "AM" i "PM".Some time representations use a 24-hour clock, others specify "AM" and "PM." Niektóre aplikacje wymagają tylko daty.Some applications need only the date. Inne osoby potrzebują tylko czasu.Others need only the time. Nadal inne osoby muszą określić datę i godzinę.Still others need to specify both the date and the time. Metody, które konwertują ciągi na DateTime obiektów, umożliwiają dostarczenie szczegółowych informacji na temat oczekiwanych formatów oraz elementów daty i czasu potrzebnych aplikacji.The methods that convert strings to DateTime objects enable you to provide detailed information about the formats you expect and the elements of a date and time your application needs. Istnieją trzy podzadania, które umożliwiają poprawne Konwertowanie tekstu na DateTime:There are three subtasks to correctly converting text into a DateTime:

  1. Należy określić oczekiwany format tekstu reprezentującego datę i godzinę.You must specify the expected format of the text representing a date and time.
  2. Można określić kulturę dla formatu daty i godziny.You may specify the culture for the format of a date time.
  3. Możesz określić, jak brakujące składniki w reprezentacji tekstowej są ustawiane w dacie i godzinie.You may specify how missing components in the text representation are set in the date and time.

Metody Parse i TryParse konwertują wiele typowych reprezentacji daty i godziny.The Parse and TryParse methods convert many common representations of a date and time. Metody ParseExact i TryParseExact konwertują reprezentację ciągu, która jest zgodna ze wzorcem określonym przez ciąg formatu daty i godziny.The ParseExact and TryParseExact methods convert a string representation that conforms to the pattern specified by a date and time format string. (Aby uzyskać szczegółowe informacje, zobacz artykuły dotyczące standardowych ciągów formatu daty i godziny oraz niestandardowych ciągów formatu daty i godziny ).(See the articles on standard date and time format strings and custom date and time format strings for details.)

Bieżący obiekt DateTimeFormatInfo zapewnia większą kontrolę nad sposobem interpretowania tekstu jako daty i godziny.The current DateTimeFormatInfo object provides more control over how text should be interpreted as a date and time. Właściwości DateTimeFormatInfo opisują separatory daty i godziny oraz nazwy miesięcy, dni i wymazywania oraz format oznaczeń "AM" i "PM".Properties of a DateTimeFormatInfo describe the date and time separators, and the names of months, days, and eras, and the format for the "AM" and "PM" designations. Bieżąca kultura wątku zawiera DateTimeFormatInfo, która reprezentuje bieżącą kulturę.The current thread culture provides a DateTimeFormatInfo that represents the current culture. Jeśli potrzebujesz określonych kultur lub ustawień niestandardowych, określisz parametr IFormatProvider metody analizy.If you want a specific culture or custom settings, you specify the IFormatProvider parameter of a parsing method. Dla parametru IFormatProvider Określ obiekt CultureInfo, który reprezentuje kulturę lub obiekt DateTimeFormatInfo.For the IFormatProvider parameter, specify a CultureInfo object, which represents a culture, or a DateTimeFormatInfo object.

Tekst reprezentujący datę lub godzinę może nie zawierać pewnych informacji.The text representing a date or time may be missing some information. Na przykład większość osób przyjmuje datę "12 marca" reprezentującą bieżący rok.For example, most people would assume the date "March 12" represents the current year. Podobnie "marzec 2018" oznacza miesiąc marca w roku 2018.Similarly, "March 2018" represents the month of March in the year 2018. Tekst reprezentujący czas często obejmuje tylko godziny, minuty i oznaczenie AM/PM.Text representing time often does only includes hours, minutes, and an AM/PM designation. Metody analizy obsługują te brakujące informacje przy użyciu odpowiednich wartości domyślnych:Parsing methods handle this missing information by using reasonable defaults:

  • Gdy jest obecny tylko czas, część daty używa bieżącej daty.When only the time is present, the date portion uses the current date.
  • Gdy tylko data jest obecna, częścią czasu jest północ.When only the date is present, the time portion is midnight.
  • Jeśli rok nie jest określony w dacie, używany jest bieżący rok.When the year isn't specified in a date, the current year is used.
  • Gdy nie jest określony dzień miesiąca, jest używany pierwszy miesiąc.When the day of the month isn't specified, the first of the month is used.

Jeśli data jest obecna w ciągu, musi zawierać miesiąc i jeden dzień lub rok.If the date is present in the string, it must include the month and one of the day or year. Jeśli czas jest obecny, musi zawierać godzinę oraz liczbę minut lub oznaczenie AM/PM.If the time is present, it must include the hour, and either the minutes or the AM/PM designator.

Możesz określić stałą NoCurrentDateDefault, aby zastąpić te ustawienia domyślne.You can specify the NoCurrentDateDefault constant to override these defaults. Gdy używasz tej stałej, wszystkie brakujące właściwości Year, Month lub Day są ustawiane na wartość 1.When you use that constant, any missing year, month, or day properties are set to the value 1. W ostatnim przykładzie użyto Parse przedstawiono to zachowanie.The last example using Parse demonstrates this behavior.

Oprócz daty i składnika czasu, Reprezentacja ciągu daty i godziny może zawierać przesunięcie, które wskazuje, ile czasu różni się od uniwersalnego czasu koordynowanego (UTC).In addition to a date and a time component, the string representation of a date and time can include an offset that indicates how much the time differs from Coordinated Universal Time (UTC). Na przykład ciąg "2/14/2007 5:32:00 -7:00" definiuje godzinę, która jest siedem godzin wcześniejsza od czasu UTC.For example, the string "2/14/2007 5:32:00 -7:00" defines a time that is seven hours earlier than UTC. Jeśli przesunięcie zostanie pominięte na podstawie ciągu reprezentującego godzinę, analiza zwraca obiekt DateTime z właściwością Kind ustawioną na DateTimeKind.Unspecified.If an offset is omitted from the string representation of a time, parsing returns a DateTime object with its Kind property set to DateTimeKind.Unspecified. Jeśli wartość przesunięcia jest określona, funkcja analizowania zwraca obiekt DateTime z właściwością Kind ustawioną na DateTimeKind.Local i jego wartości dostosowuje się do lokalnej strefy czasowej maszyny.If an offset is specified, parsing returns a DateTime object with its Kind property set to DateTimeKind.Local and its value adjusted to the local time zone of your machine. Możesz zmodyfikować to zachowanie przy użyciu wartości DateTimeStyles z metodą analizy.You can modify this behavior by using a DateTimeStyles value with the parsing method.

Dostawca formatu jest również używany do interpretowania niejednoznacznej daty liczbowej.The format provider is also used to interpret an ambiguous numeric date. Nie jest jasne, które składniki daty reprezentowanej przez ciąg "02/03/04" to miesiąc, dzień i rok.It is not clear which components of the date represented by the string "02/03/04" are the month, day, and year. Składniki są interpretowane zgodnie z kolejnością podobnych formatów daty w dostawcy formatu.The components are interpreted according to the order of similar date formats in the format provider.

AnalizujParse

Poniższy przykład ilustruje użycie metody DateTime.Parse, aby skonwertować string do DateTime.The following example illustrates the use of the DateTime.Parse method to convert a string into a DateTime. W tym przykładzie zastosowano kulturę skojarzoną z bieżącym wątkiem.This example uses the culture associated with the current thread. Jeśli CultureInfo skojarzona z bieżącą kulturą nie może przeanalizować ciągu wejściowego, zostanie zgłoszony FormatException.If the CultureInfo associated with the current culture cannot parse the input string, a FormatException is thrown.

Porada

Wszystkie C# przykłady w tym artykule działają w przeglądarce.All the C# samples in this article run in your browser. Naciśnij przycisk Run (Uruchom ), aby wyświetlić dane wyjściowe.Press the Run button to see the output. Możesz również edytować je, aby samodzielnie eksperymentować.You can also edit them to experiment yourself.

Uwaga

Te przykłady są dostępne w repozytorium docs w witrynie GitHub dla C# obu i Visual Basic.These examples are available in the GitHub docs repo for both C# and Visual Basic. Lub można pobrać projekt jako plik ZIP dla C# lub Visual Basic.Or, you can download the project as a zip file for C# or Visual Basic.

string dateInput = "Jan 1, 2009";
DateTime parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 12:00:00 AM
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 12:00:00 AM

Można również jawnie zdefiniować kulturę, której konwencje formatowania są używane podczas analizowania ciągu.You can also explicitly define the culture whose formatting conventions are used when you parse a string. Należy określić jeden ze standardowych obiektów DateTimeFormatInfo zwracanych przez właściwość CultureInfo.DateTimeFormat.You specify one of the standard DateTimeFormatInfo objects returned by the CultureInfo.DateTimeFormat property. Poniższy przykład używa dostawcy formatu do analizy ciągu niemieckiego w DateTime.The following example uses a format provider to parse a German string into a DateTime. Tworzy CultureInfo reprezentujący de-DE kulturę.It creates a CultureInfo representing the de-DE culture. Ten obiekt CultureInfo gwarantuje pomyślne analizowanie tego określonego ciągu.That CultureInfo object ensures successful parsing of this particular string. Wyklucza to, niezależnie od tego, jakie ustawienie znajduje się w CurrentCulture CurrentThread.This precludes whatever setting is in the CurrentCulture of the CurrentThread.

CultureInfo MyCultureInfo = new CultureInfo("de-DE");
string MyString = "12 Juni 2008";
DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo);
Console.WriteLine(MyDateTime);
// The example displays the following output:
//       6/12/2008 12:00:00 AM
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 12:00:00 AM

Jednak chociaż można użyć przeciążenia metody Parse, aby określić dostawców formatów niestandardowych, metoda nie obsługuje analizowania formatów niestandardowych.However, although you can use overloads of the Parse method to specify custom format providers, the method does not support parsing non-standard formats. Aby przeanalizować datę i godzinę wyrażoną w formacie niestandardowym, należy zamiast tego użyć metody ParseExact.To parse a date and time expressed in a non-standard format, use the ParseExact method instead.

Poniższy przykład używa wyliczenia DateTimeStyles, aby określić, że bieżące informacje o dacie i godzinie nie powinny być dodawane do DateTime dla nieokreślonych pól.The following example uses the DateTimeStyles enumeration to specify that the current date and time information should not be added to the DateTime for unspecified fields.

CultureInfo MyCultureInfo = new CultureInfo("de-DE");
string MyString = "12 Juni 2008";
DateTime MyDateTime = 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 12:00:00 AM
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 12:00:00 AM

ParseExactParseExact

Metoda DateTime.ParseExact konwertuje ciąg na obiekt DateTime, jeśli jest zgodny z jednym z określonych wzorców ciągu.The DateTime.ParseExact method converts a string to a DateTime object if it conforms to one of the specified string patterns. Gdy ciąg, który nie jest jednym z określonych formularzy jest przenoszona do tej metody, zostanie zgłoszony FormatException.When a string that is not one of the forms specified is passed to this method, a FormatException is thrown. Można określić jeden z standardowych specyfikatorów formatu daty i godziny lub kombinację niestandardowych specyfikatorów formatu.You can specify one of the standard date and time format specifiers or a combination of the custom format specifiers. Przy użyciu specyfikatorów formatu niestandardowego można utworzyć niestandardowy ciąg rozpoznawania.Using the custom format specifiers, it is possible for you to construct a custom recognition string. Aby uzyskać wyjaśnienie specyfikatorów, zobacz tematy dotyczące standardowych ciągów formatu daty i godziny oraz niestandardowych ciągów formatu daty i godziny.For an explanation of the specifiers, see the topics on standard date and time format strings and custom date and time format strings.

W poniższym przykładzie metoda DateTime.ParseExact jest przenoszona przez obiekt ciągu do analizy, po którym następuje specyfikator formatu, po którym następuje obiekt CultureInfo.In the following example, the DateTime.ParseExact method is passed a string object to parse, followed by a format specifier, followed by a CultureInfo object. Ta metoda ParseExact może analizować tylko ciągi, które są zgodne ze wzorcem daty długiej w kulturze en-US.This ParseExact method can only parse strings that follow the long date pattern in the en-US culture.

CultureInfo MyCultureInfo = new CultureInfo("en-US");
string[] MyString = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in MyString)
{
    try
    {
        DateTime MyDateTime = DateTime.ParseExact(dateString, "D", MyCultureInfo);
        Console.WriteLine(MyDateTime);
    }
    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 12:00:00 AM
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 12:00:00 AM

Każde Przeciążenie metod Parse i ParseExact również ma IFormatProvider parametr, który zawiera informacje specyficzne dla kultury dotyczące formatowania ciągu.Each overload of the Parse and ParseExact methods also has an IFormatProvider parameter that provides culture-specific information about the formatting of the string. Ten obiekt IFormatProvider jest obiektem CultureInfo, który reprezentuje kulturę standardową lub obiekt DateTimeFormatInfo, który jest zwracany przez właściwość CultureInfo.DateTimeFormat.This IFormatProvider object is a CultureInfo object that represents a standard culture or a DateTimeFormatInfo object that is returned by the CultureInfo.DateTimeFormat property. ParseExact używa również dodatkowego argumentu ciągu lub tablicy ciągów, który definiuje jeden lub więcej niestandardowych formatów daty i godziny.ParseExact also uses an additional string or string array argument that defines one or more custom date and time formats.

Zobacz takżeSee also