Condividi tramite


Analizzare le stringhe di data e ora in .NET

L'analisi delle stringhe per convertirle in DateTime oggetti richiede di specificare informazioni su come le date e le ore vengono rappresentate come testo. Culture diverse usano ordini diversi per giorno, mese e anno. Alcune rappresentazioni temporali usano un orologio di 24 ore, altre specificano "AM" e "PM". Alcune applicazioni necessitano solo della data. Altri hanno bisogno solo del tempo. Altri ancora devono specificare sia la data che l'ora. I metodi che converte le stringhe in DateTime oggetti consentono di fornire informazioni dettagliate sui formati previsti e sugli elementi di una data e dell'ora necessarie per l'applicazione. Esistono tre sottoattività per convertire correttamente il testo in :DateTime

  1. È necessario specificare il formato previsto del testo che rappresenta una data e un'ora.
  2. È possibile specificare la cultura per il formato di una data e ora.
  3. È possibile specificare il modo in cui i componenti mancanti nella rappresentazione di testo vengono impostati nella data e nell'ora.

I Parse metodi e TryParse converteno molte rappresentazioni comuni di una data e un'ora. I metodi ParseExact e TryParseExact convertono una stringa conforme al modello specificato da una stringa di formato di data e ora. Per altre informazioni, vedere gli articoli sulle stringhe di formato data e ora standard e stringhe di formato di data e ora personalizzate.

L'oggetto corrente DateTimeFormatInfo fornisce un maggiore controllo sul modo in cui il testo deve essere interpretato come data e ora. Le proprietà di un DateTimeFormatInfo oggetto descrivono i separatori di data e ora, i nomi di mesi, giorni ed ere e il formato per le designazioni "AM" e "PM". L'oggetto CultureInfo restituito da CultureInfo.CurrentCulture ha una CultureInfo.DateTimeFormat proprietà che rappresenta le impostazioni culturali correnti. Se si vogliono impostazioni culturali o personalizzate specifiche, specificare il parametro IFormatProvider di un metodo di analisi. Per il parametro IFormatProvider, specificare un oggetto CultureInfo che rappresenta un'impostazione cultura, o un oggetto DateTimeFormatInfo.

Il testo che rappresenta una data o un'ora potrebbe non avere alcune informazioni. Ad esempio, la maggior parte delle persone presuppone che la data "Marzo 12" rappresenti l'anno corrente. Analogamente, "Marzo 2018" rappresenta il mese di marzo nell'anno 2018. Il testo che rappresenta l'ora spesso include solo ore, minuti e una designazione AM/PM. I metodi di analisi gestiscono queste informazioni mancanti usando valori predefiniti ragionevoli:

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

Se la data è presente nella stringa, deve includere il mese e uno del giorno o dell'anno. Se l'ora è presente, deve includere l'ora e i minuti o l'indicatore AM/PM.

È possibile specificare la costante per eseguire l'override NoCurrentDateDefault di queste impostazioni predefinite. Quando si usa tale costante, le proprietà di anno, mese o giorno mancanti vengono impostate sul valore 1. L'ultimo esempio che usa Parse illustra questo comportamento.

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

Il provider di formato viene usato anche per interpretare una data numerica ambigua. Non è 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.

Analizzare

Nell'esempio seguente viene illustrato l'uso del DateTime.Parse metodo per convertire un oggetto string in un oggetto DateTime. In questo esempio viene utilizzata la cultura associata al thread corrente. Se l'oggetto CultureInfo associato alla cultura corrente 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 Esegui per visualizzare l'output. È anche possibile modificarli per sperimentare manualmente.

Nota

Questi esempi sono disponibili nel repository della documentazione di GitHub sia per C# che per 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 la cultura le cui convenzioni di formattazione vengono utilizzate durante l'esame di una stringa. Specificare uno degli oggetti standard DateTimeFormatInfo restituiti dalla CultureInfo.DateTimeFormat proprietà . Nell'esempio seguente viene usato un provider di formato per analizzare una stringa tedesca in un oggetto DateTime. Crea un oggetto CultureInfo che rappresenta la cultura de-DE. L'oggetto CultureInfo garantisce un'analisi corretta di questa particolare stringa. Questo processo esclude qualsiasi impostazione nel 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, è possibile usare i sovraccarichi del metodo Parse per specificare fornitori di formati personalizzati. Il Parse metodo non supporta l'analisi di formati non standard. Per analizzare una data e un'ora espressa in un formato non standard, usare invece il ParseExact metodo .

Nell'esempio seguente viene utilizzata l'enumerazione DateTimeStyles per specificare che le informazioni di data e 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 DateTime.ParseExact metodo converte una stringa in un DateTime oggetto se è conforme a uno dei modelli di stringa specificati. Quando una stringa che non è una delle forme specificate 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 personalizzati. Usando gli identificatori di formato personalizzati, è possibile creare una stringa di riconoscimento personalizzata. Per una spiegazione degli identificatori, vedere gli articoli sulle stringhe di formato di data e ora standard e stringhe di formato di data e ora personalizzate.

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 ParseExact metodo può interpretare solo le stringhe che seguono il formato di data lungo nella en-US cultura.

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 '{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 include anche un parametro IFormatProvider che fornisce informazioni specifiche alle impostazioni cultura-specifiche sulla formattazione della stringa. L'oggetto IFormatProvider è un oggetto CultureInfo che rappresenta una cultura standard o un oggetto DateTimeFormatInfo restituito dalla proprietà CultureInfo.DateTimeFormat. ParseExact usa inoltre un argomento stringa o matrice di stringhe aggiuntivo che definisce uno o più formati di data e ora personalizzati.

Vedere anche