Parsa datum- och tidssträngar i .NET

Om du parsar strängar för att konvertera dem till DateTime objekt måste du ange information om hur datum och tider representeras som text. Olika kulturer använder olika beställningar för dag, månad och år. Vissa tidsrepresentationer använder en 24-timmarsklocka, andra anger "AM" och "PM". Vissa program behöver bara datumet. Andra behöver bara tiden. Ytterligare andra måste ange både datum och tid. Med de metoder som konverterar strängar till DateTime objekt kan du ange detaljerad information om de format du förväntar dig och elementen för ett datum och en tid som programmet behöver. Det finns tre underaktiviteter för att korrekt konvertera text till en DateTime:

  1. Du måste ange det förväntade formatet för texten som representerar ett datum och en tid.
  2. Du kan ange kulturen för formatet för en datumtid.
  3. Du kan ange hur komponenter som saknas i textrepresentationen anges i datum och tid.

Metoderna Parse och TryParse konverterar många vanliga representationer av ett datum och en tid. Metoderna ParseExact och TryParseExact konverterar en strängrepresentation som överensstämmer med det mönster som anges av en datum- och tidsformatsträng. Mer information finns i artiklarna om standardsträngar för datum- och tidsformat och anpassade datum- och tidsformatsträngar.

Det aktuella DateTimeFormatInfo objektet ger mer kontroll över hur text ska tolkas som ett datum och en tid. Egenskaper för en DateTimeFormatInfo beskriver datum- och tidsavgränsare, namnen på månader, dagar och epoker samt formatet för beteckningarna "AM" och "PM". Den CultureInfo som returneras av CultureInfo.CurrentCulture har en CultureInfo.DateTimeFormat egenskap som representerar den aktuella kulturen. Om du vill ha en specifik kultur eller anpassade inställningar anger du parametern för IFormatProvider en parsningsmetod. För parametern IFormatProvider anger du ett CultureInfo objekt som representerar en kultur eller ett DateTimeFormatInfo objekt.

Texten som representerar ett datum eller en tid kanske saknar viss information. De flesta skulle till exempel anta att datumet "12 mars" representerar det aktuella året. På samma sätt representerar "mars 2018" mars månad 2018. Text som representerar tid omfattar ofta bara timmar, minuter och en AM/PM-beteckning. Parsningsmetoder hanterar den här saknade informationen med hjälp av rimliga standardvärden:

  • När endast tiden är närvarande använder datumdelen det aktuella datumet.
  • När endast datumet är närvarande är tidsdelen midnatt.
  • När året inte anges i ett datum används det aktuella året.
  • När dagen i månaden inte anges används den första dagen i månaden.

Om datumet finns i strängen måste det innehålla månaden och en av dagen eller året. Om tiden är närvarande måste den innehålla timmen och antingen minuter eller AM/PM-designatorn.

Du kan ange konstanten NoCurrentDateDefault för att åsidosätta dessa standardvärden. När du använder den konstanten anges eventuella saknade egenskaper för år, månad eller dag till värdet 1. Det sista exemplet som används Parse visar det här beteendet.

Förutom ett datum och en tidskomponent kan strängrepresentationen av ett datum och en tid innehålla en förskjutning som anger hur mycket tiden skiljer sig från UTC (Coordinated Universal Time). Strängen "2/14/2007 5:32:00 -7:00" definierar till exempel en tid som är sju timmar tidigare än UTC. Om en förskjutning utelämnas från strängrepresentationen av en tid returnerar parsning ett DateTime objekt med dess Kind egenskap inställd på DateTimeKind.Unspecified. Om en förskjutning anges returnerar parsning ett DateTime objekt med dess Kind egenskap inställd på DateTimeKind.Local. Dess värde justeras också till datorns lokala tidszon. Du kan ändra det här beteendet med hjälp av ett DateTimeStyles värde med parsningsmetoden.

Formatprovidern används också för att tolka ett tvetydigt numeriskt datum. Det är oklart vilka komponenter i datumet som representeras av strängen "02/03/04" är månad, dag och år. Komponenterna tolkas enligt ordningen för liknande datumformat i formatprovidern.

Parsa

I följande exempel visas hur metoden används DateTime.Parse för att konvertera en string till en DateTime. I det här exemplet används kulturen som är associerad med den aktuella tråden. Om den CultureInfo associerade med den aktuella kulturen inte kan parsa indatasträngen genereras en FormatException .

Dricks

Alla C#-exempel i den här artikeln körs i webbläsaren. Tryck på knappen Kör för att se utdata. Du kan också redigera dem för att experimentera själv.

Kommentar

De här exemplen finns i GitHub-dokumentlagringsplatsen för både C# och 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

Du kan också uttryckligen definiera den kultur vars formateringskonventioner används när du parsar en sträng. Du anger ett av standardobjekten DateTimeFormatInfo som returneras av CultureInfo.DateTimeFormat egenskapen. I följande exempel används en formatprovider för att parsa en tysk sträng till en DateTime. Det skapar en CultureInfo som representerar de-DE kulturen. Det CultureInfo objektet säkerställer lyckad parsning av den här strängen. Den här processen utesluter den inställning som finns i CurrentCulture i 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

Du kan dock använda överlagringar av Parse metoden för att ange anpassade formatprovidrar. Metoden Parse stöder inte parsning av icke-standardformat. Om du vill parsa ett datum och en tid som uttrycks i ett icke-standardformat använder du ParseExact metoden i stället.

I följande exempel används DateTimeStyles uppräkningen för att ange att aktuell datum- och tidsinformation inte ska läggas till i DateTime för ospecificerade fält.

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

Metoden DateTime.ParseExact konverterar en sträng till ett DateTime objekt om den överensstämmer med något av de angivna strängmönstren. När en sträng som inte är ett av de angivna formulären skickas till den här metoden genereras en FormatException . Du kan ange någon av standardformatsspecificerarna för datum och tid eller en kombination av de anpassade formatspecificerarna. Med hjälp av anpassade formatspecificerare kan du skapa en anpassad igenkänningssträng. En förklaring av specificerarna finns i artiklarna om standardsträngar för datum- och tidsformat och anpassade datum- och tidsformatsträngar.

I följande exempel DateTime.ParseExact skickas metoden ett strängobjekt för att parsa, följt av en formatspecificerare följt av ett CultureInfo objekt. Den här ParseExact metoden kan bara parsa strängar som följer det långa datummönstret i en-US kulturen.

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

Varje överlagring av Parse metoderna och ParseExact har också en IFormatProvider parameter som ger kulturspecifik information om strängens formatering. Objektet IFormatProvider är ett CultureInfo objekt som representerar en standardkultur eller ett DateTimeFormatInfo objekt som returneras av egenskapen CultureInfo.DateTimeFormat . ParseExact använder också ytterligare ett sträng- eller strängmatrisargument som definierar ett eller flera anpassade datum- och tidsformat.

Se även