Analizzare le stringhe di data e ora in .NET

L'analisi delle stringhe per convertirle in oggetti DateTime richiede di specificare informazioni sulla modalità di rappresentazione di date e ore come testo. Impostazioni cultura diverse usano ordini differenti per giorno, mese e anno. Alcune rappresentazioni di ora usano un orologio di 24 ore, altre specificano "AM" e "PM". Alcune applicazioni richiedono solo la data, mentre altre solo l'ora e altre ancora devono specificare sia la data che l'ora. I metodi per la conversione di stringhe in oggetti DateTime consentono di fornire informazioni dettagliate sui formati previsti e sugli elementi di data e ora necessari per l'applicazione. La conversione corretta di testo in un oggetto DateTime include tre sottoattività:

  1. È necessario specificare il formato previsto del testo che rappresenta una data e ora.
  2. È possibile specificare le impostazioni cultura per il formato di una data e ora.
  3. È possibile specificare come impostare nella data e ora i componenti mancanti nella rappresentazione di testo.

I metodi Parse e TryParse consentono di convertire molte rappresentazioni comuni di data e ora. I metodi ParseExact e TryParseExact convertono una rappresentazione di stringa conforme al criterio specificato da una stringa di formato di data e ora. Per altri dettagli, vedere gli articoli relativi alle stringhe di formato di data e ora standard e alle stringhe di formato di data e ora personalizzato.

L'oggetto DateTimeFormatInfo corrente consente un maggiore controllo sulla modalità di interpretazione del testo come data e ora. Le proprietà di un oggetto DateTimeFormatInfo descrivono i separatori di data e ora, i nomi di mesi, giorni ed ere, nonché il formato per gli indicatori "AM" e "PM". Le impostazioni cultura del thread corrente forniscono un oggetto DateTimeFormatInfo che rappresenta le impostazioni cultura correnti. Se si vogliono usare impostazioni cultura specifiche o impostazioni personalizzate, specificare il parametro IFormatProvider di un metodo di analisi. Per il parametro IFormatProvider, specificare un oggetto CultureInfo, che rappresenta determinate impostazioni cultura o un oggetto DateTimeFormatInfo.

Nel testo che rappresenta una data o ora è possibile che manchino alcune informazioni. Ad esempio, la maggior parte delle persone dedurrebbe che la data "12 marzo" rappresenta l'anno corrente. In modo analogo, "marzo 2018" rappresenta il mese di marzo nell'anno 2018. Il testo che rappresenta l'ora spesso include solo ore e minuti e l'indicatore AM/PM. I metodi di analisi gestiscono le informazioni mancanti usando impostazioni predefinite ragionevoli:

  • Quando è presente solo l'ora, per la parte relativa alla data viene usata la data corrente.
  • Se è presente solo la data, la parte dell'ora è mezzanotte.
  • Se l'anno non è specificato in una data, viene usato l'anno corrente.
  • Quando non viene specificato il giorno del mese, viene usato il primo giorno del mese.

Se la stringa include la data, deve essere incluso il mese e un giorno o un anno. Se è presente l'ora, deve includere l'ora e i minuti o l'indicatore AM/PM.

È possibile specificare la costante NoCurrentDateDefault per sostituire queste impostazioni predefinite. Quando si usa questa costante, le eventuali proprietà mancanti per anno, mese o giorno vengono impostate sul valore 1. L'ultimo esempio che usa Parse dimostra questo comportamento.

Oltre a un componente di data e ora, la rappresentazione di stringa di una data e un'ora può includere un offset che indica in che misura l'ora differisce dall'ora UTC (Coordinated Universal Time). Ad esempio, la stringa "2/14/2007 5:32:00 -7:00" definisce un'ora che precede di sette ore l'ora UTC. Se viene omesso l'offset dalla rappresentazione di stringa di un'ora, l'analisi restituisce un oggetto DateTime con la relativa proprietà Kind impostata su DateTimeKind.Unspecified. Se viene specificato un offset, l'analisi restituisce un oggetto DateTime con la relativa proprietà Kind impostata su DateTimeKind.Local e il relativo valore adeguato in base al fuso orario locale del computer. È possibile modificare questo comportamento usando un valore DateTimeStyles con il metodo di analisi.

Il provider di formato viene usato anche per interpretare una data numerica ambigua. Non risulta chiaro quali componenti della data rappresentata dalla stringa "02/03/04" sono il mese, il giorno e l'anno. I componenti vengono interpretati in base all'ordine dei formati di data simili nel provider di formato.

Analizza

L'esempio seguente illustra l'uso del metodo DateTime.Parse per convertire un valore string in DateTime. Questo esempio usa le impostazioni cultura associate al thread corrente. Se l'oggetto CultureInfo associato alle impostazioni cultura correnti non è in grado di analizzare la stringa di input, viene generata un'eccezione FormatException.

Suggerimento

Tutti gli esempi C# in questo articolo vengono eseguiti nel browser. Premere il pulsante Run (Esegui) per visualizzare l'output. È anche possibile modificarli per sperimentare.

Nota

Questi esempi sono disponibili nel repository docs di GitHub per C# e 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

È anche possibile definire in modo esplicito le impostazioni cultura di cui usare le convenzioni di formattazione per l'analisi di una stringa. È necessario specificare uno degli oggetti DateTimeFormatInfo standard restituiti dalla proprietà CultureInfo.DateTimeFormat. L'esempio seguente usa un provider di formato per analizzare una stringa in lingua tedesca in un DateTime. Crea un oggetto CultureInfo che rappresenta le impostazioni cultura de-DE. L'oggetto CultureInfo assicura l'analisi corretta di questa stringa particolare. Questo preclude qualsiasi impostazione in CurrentCulture di 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

Tuttavia, sebbene sia possibile usare overload del metodo Parse per specificare provider di formato personalizzati, il metodo non supporta l'analisi di formati non standard. Per analizzare una data e un'ora espresse in un formato non standard, usare il metodo ParseExact.

L'esempio seguente usa l'enumerazione DateTimeStyles per specificare che le informazioni sulla data e l'ora correnti non devono essere aggiunte a DateTime per i campi non specificati.

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

Il metodo DateTime.ParseExact converte una stringa in un oggetto DateTime se è conforme a uno dei modelli di stringa specificati. Quando una stringa che non è in uno dei formati specificati viene passata a questo metodo, viene generata un'eccezione FormatException. È possibile specificare uno degli identificatori di formato di data e ora standard o una combinazione degli identificatori di formato personalizzato. Usando gli identificatori di formato personalizzato è possibile costruire una stringa di riconoscimento personalizzata. Per una spiegazione degli identificatori, vedere gli argomenti relativi alle stringhe di formato di data e ora standard e alle stringhe di formato di data e ora personalizzato.

Nell'esempio seguente, al metodo DateTime.ParseExact viene passato un oggetto stringa da analizzare, seguito da un identificatore di formato, seguito da un oggetto CultureInfo. Questo metodo ParseExact consente di analizzare solo le stringhe con il modello di data estesa nelle impostazioni cultura 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 '{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

Ogni overload dei metodi Parse e ParseExact usa anche un parametro IFormatProvider che indica informazioni specifiche delle impostazioni cultura sulla formattazione della stringa. Questo oggetto IFormatProvider è un oggetto CultureInfo che rappresenta le impostazioni cultura standard o un oggetto DateTimeFormatInfo restituito dalla proprietà CultureInfo.DateTimeFormat. ParseExact usa anche un argomento stringa o matrice di stringhe aggiuntivo che definisce uno o più formati di data e ora personalizzati.

Vedi anche