Datum- en tijdtekenreeksen parseren in .NET

Als u tekenreeksen parseert om ze te converteren naar DateTime objecten, moet u informatie opgeven over hoe de datums en tijden worden weergegeven als tekst. Verschillende culturen gebruiken verschillende orders voor dag, maand en jaar. Sommige tijdweergaven gebruiken een 24-uurs klok, anderen geven 'AM' en 'PM' op. Sommige toepassingen hebben alleen de datum nodig. Anderen hebben alleen de tijd nodig. Nog andere moeten zowel de datum als de tijd opgeven. Met de methoden waarmee tekenreeksen naar DateTime objecten worden geconverteerd, kunt u gedetailleerde informatie geven over de verwachte indelingen en de elementen van een datum en tijd die uw toepassing nodig heeft. Er zijn drie subtaken om tekst correct te converteren naar een DateTime:

  1. U moet de verwachte notatie opgeven van de tekst die een datum en tijd vertegenwoordigt.
  2. U kunt de cultuur opgeven voor de notatie van een datum/tijd.
  3. U kunt opgeven hoe ontbrekende onderdelen in de tekstweergave worden ingesteld in de datum en tijd.

De Parse en TryParse methoden converteren veel algemene weergaven van een datum en tijd. De ParseExact en TryParseExact methoden converteren een tekenreeksweergave die voldoet aan het patroon dat is opgegeven door een tekenreeks voor datum- en tijdnotatie. Zie de artikelen over standaardtekenreeksen voor datum- en tijdnotatie en aangepaste datum- en tijdnotatietekenreeksen voor meer informatie.

Het huidige DateTimeFormatInfo object biedt meer controle over hoe tekst moet worden geïnterpreteerd als een datum en tijd. Eigenschappen van een DateTimeFormatInfo beschrijving van de datum- en tijdscheidingstekens, de namen van maanden, dagen en tijdperken, en de notatie voor de aanduidingen AM en PM. De CultureInfo geretourneerde CultureInfo.CurrentCulture eigenschap heeft een CultureInfo.DateTimeFormat eigenschap die de huidige cultuur vertegenwoordigt. Als u een specifieke cultuur of aangepaste instellingen wilt, geeft u de IFormatProvider parameter van een parseringsmethode op. Geef voor de IFormatProvider parameter een CultureInfo object op dat een cultuur of een DateTimeFormatInfo object vertegenwoordigt.

In de tekst voor een datum of tijd ontbreken mogelijk bepaalde gegevens. De meeste mensen gaan er bijvoorbeeld van uit dat de datum '12 maart' het huidige jaar aangeeft. Op dezelfde manier vertegenwoordigt 'maart 2018' de maand maart in het jaar 2018. Tekst die de tijd vertegenwoordigt, omvat vaak alleen uren, minuten en een AM/PM-aanduiding. Bij het parseren van methoden wordt deze ontbrekende informatie verwerkt met behulp van redelijke standaardwaarden:

  • Wanneer alleen de tijd aanwezig is, gebruikt het datumgedeelte de huidige datum.
  • Wanneer alleen de datum aanwezig is, is het tijdgedeelte middernacht.
  • Wanneer het jaar niet is opgegeven in een datum, wordt het huidige jaar gebruikt.
  • Wanneer de dag van de maand niet is opgegeven, wordt de eerste dag van de maand gebruikt.

Als de datum aanwezig is in de tekenreeks, moet deze de maand en een van de dag of het jaar bevatten. Als de tijd aanwezig is, moet deze het uur en de minuten of de AM/PM-ontwerpfunctie bevatten.

U kunt de NoCurrentDateDefault constante opgeven om deze standaardwaarden te overschrijven. Wanneer u die constante gebruikt, worden ontbrekende jaar-, maand- of dageigenschappen ingesteld op de waarde 1. In het laatste voorbeeld ziet Parse u dit gedrag.

Naast een datum- en tijdonderdeel kan de tekenreeksweergave van een datum en tijd een offset bevatten die aangeeft hoeveel tijd verschilt van Coordinated Universal Time (UTC). De tekenreeks 2-14-2007 5:32:00 -7:00 definieert bijvoorbeeld een tijd die zeven uur ouder is dan UTC. Als een offset wordt weggelaten uit de tekenreeksweergave van een tijd, retourneert parseren een DateTime object met de Kind eigenschap ingesteld op DateTimeKind.Unspecified. Als er een offset is opgegeven, retourneert parseren een DateTime object met de Kind eigenschap ingesteld op DateTimeKind.Local. De waarde wordt ook aangepast aan de lokale tijdzone van uw computer. U kunt dit gedrag wijzigen met behulp van een DateTimeStyles waarde met de parseringsmethode.

De notatieprovider wordt ook gebruikt om een dubbelzinnige numerieke datum te interpreteren. Het is onduidelijk welke onderdelen van de datum die worden vertegenwoordigd door de tekenreeks '02/03/04' de maand, de dag en het jaar zijn. De onderdelen worden geïnterpreteerd volgens de volgorde van vergelijkbare datumnotaties in de indelingsprovider.

Parseren

In het volgende voorbeeld ziet u het gebruik van de DateTime.Parse methode om een string te converteren naar een DateTime. In dit voorbeeld wordt de cultuur gebruikt die is gekoppeld aan de huidige thread. Als de CultureInfo gekoppelde aan de huidige cultuur de invoertekenreeks niet kan parseren, wordt er een FormatException gegenereerd.

Tip

Alle C#-voorbeelden in dit artikel worden uitgevoerd in uw browser. Druk op de knop Uitvoeren om de uitvoer weer te geven. U kunt ze ook bewerken om zelf te experimenteren.

Notitie

Deze voorbeelden zijn beschikbaar in de GitHub Docs-opslagplaats voor zowel C# als 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

U kunt ook expliciet de cultuur definiëren waarvan de opmaakconventies worden gebruikt wanneer u een tekenreeks parseert. U geeft een van de standaardobjecten DateTimeFormatInfo op die door de CultureInfo.DateTimeFormat eigenschap worden geretourneerd. In het volgende voorbeeld wordt een indelingsprovider gebruikt om een Duitse tekenreeks te parseren in een DateTime. Het creëert een CultureInfo representatie van de de-DE cultuur. Dit CultureInfo object zorgt ervoor dat deze specifieke tekenreeks succesvol wordt geparseerd. Dit proces voorkomt elke instelling in de CurrentCultureCurrentThread.

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

U kunt echter overbelastingen van de Parse methode gebruiken om providers voor aangepaste indelingen op te geven. De Parse methode biedt geen ondersteuning voor het parseren van niet-standaardindelingen. Als u een datum en tijd wilt parseren die zijn uitgedrukt in een niet-standaardnotatie, gebruikt u in plaats daarvan de ParseExact methode.

In het volgende voorbeeld wordt de DateTimeStyles opsomming gebruikt om op te geven dat de huidige datum- en tijdgegevens niet moeten worden toegevoegd aan de DateTime niet-opgegeven velden.

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

Met DateTime.ParseExact de methode wordt een tekenreeks geconverteerd naar een DateTime object als deze voldoet aan een van de opgegeven tekenreekspatronen. Wanneer een tekenreeks die geen van de opgegeven formulieren is, wordt doorgegeven aan deze methode, wordt er een FormatException gegenereerd. U kunt een van de standaardaanduidingen voor datum- en tijdnotatie of een combinatie van de aangepaste notatieaanduidingen opgeven. Met behulp van de aangepaste notatieaanduidingen kunt u een aangepaste herkenningstekenreeks maken. Zie de artikelen over standaardtekenreeksen voor datum- en tijdnotaties en aangepaste datum- en tijdnotatietekenreeksen voor een uitleg van de aanduidingen.

In het volgende voorbeeld wordt de DateTime.ParseExact methode doorgegeven aan een tekenreeksobject om te parseren, gevolgd door een notatieaanduiding, gevolgd door een CultureInfo object. Deze ParseExact methode kan alleen tekenreeksen parseren die het lange datumpatroon in de en-US cultuur volgen.

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

Elke overbelasting van de Parse en ParseExact methoden heeft ook een IFormatProvider parameter die cultuurspecifieke informatie biedt over de opmaak van de tekenreeks. Het IFormatProvider object is een CultureInfo object dat een standaardcultuur of een DateTimeFormatInfo object vertegenwoordigt dat door de CultureInfo.DateTimeFormat eigenschap wordt geretourneerd. ParseExact gebruikt ook een extra tekenreeks- of tekenreeksmatrixargument dat een of meer aangepaste datum- en tijdnotaties definieert.

Zie ook