C# – Analisi di una stringa DateTime con un formato personalizzato

C# – Analisi di una stringa DateTime con un formato personalizzato

Nella maggior parte dei casi, quando è necessario analizzare una stringa datetime con un formato personalizzato, è possibile passare l'identificatore di formato e utilizzare DateTime.TryParseExact() (o ParseExact()), in questo modo:

public DateTime? ParseDate(string date)
{
	if (DateTime.TryParseExact(date, "M/d/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dt))
	{
		return dt;
	}
	return null;
}
Code language: C# (cs)

Questo sta usando l'identificatore di formato "M/g/aaaa".

  • M =mese a 1-2 cifre.
  • d =giorno a 1-2 cifre.
  • aaaa =anno a 4 cifre.

Il codice seguente utilizza questo metodo:

Console.WriteLine($"Parsed 1/1/2021 into {ParseDate("1/1/2021")}");
Console.WriteLine($"Parsed 01/01/2021 into {ParseDate("01/01/2021")}");
Code language: C# (cs)

Questo genera quanto segue:

Parsed 1/1/2021 into 1/1/2021 12:00:00 AM
Parsed 01/01/2021 into 1/1/2021 12:00:00 AMCode language: plaintext (plaintext)

Si noti che è stato in grado di gestire il mese "1" e "01", perché "M" è un identificatore di cifre di 1-2 mesi. Quando si passa l'identificatore di formato, IntelliSense visualizzerà un elenco completo dei possibili valori dell'identificatore di formato e una descrizione di ciò che fanno (nota:sto usando VS2019 ). Puoi anche fare riferimento a questa pagina MSDN su tutti i possibili identificatori di formato.

Analisi di un anno a due cifre

Sappiamo tutti che è una cattiva idea usare anni a due cifre. Quando usi un anno a due cifre, perdi informazioni e devi indovinare quale anno a quattro cifre rappresenta.

Quando si analizza un anno a due cifre con DateTime.ParseExact(), utilizza CultureInfo.Calendar.TwoDigitYearMax per determinare come analizzarlo in un anno a quattro cifre. Il TwoDigitYearMax predefinito sul mio sistema in questo momento è 2049. Puoi passare un CultureInfo e impostare TwoDigitYearMax su qualsiasi valore abbia senso nel tuo scenario.

Ecco un esempio. Diciamo che ho bisogno di analizzare "9912" in "yyMM" e so che ho a che fare con date future nel secolo in corso. Se lascio utilizzare il TwoDigitYearMax predefinito, lo analizzerà in "12/1/1999". Voglio davvero che analizzi "12/1/2099", quindi devo impostare TwoDigitYearMax=2100, in questo modo:

string date = "9912";

CultureInfo culture = new CultureInfo("en-US");
culture.Calendar.TwoDigitYearMax = 2100;

if (DateTime.TryParseExact(date, "yyMM", culture, DateTimeStyles.None, out DateTime dt))
{
	Console.WriteLine($"Parsed {date} into {dt}");
}
else
{
	Console.WriteLine($"Unable to parse {date}");
}
Code language: C# (cs)

Questo ha prodotto quanto segue:

Parsed 9912 into 12/1/2099 12:00:00 AMCode language: plaintext (plaintext)

L'anno in corso è il 2021. E se volessi presumere che l'anno a due cifre inizi sempre con l'anno in corso? Posso impostare TwoDigitYearMax sull'anno corrente + 99, in questo modo:

string date = "2112";

CultureInfo culture = new CultureInfo("en-US");
culture.Calendar.TwoDigitYearMax = DateTime.Now.Year + 99;

if (DateTime.TryParseExact(date, "yyMM", culture, DateTimeStyles.None, out DateTime dt))
{
	Console.WriteLine($"Parsed {date} into {dt}");
}
else
{
	Console.WriteLine($"Unable to parse {date}");
}
Code language: C# (cs)

Questo ha prodotto quanto segue:

Parsed 2112 into 12/1/2021 12:00:00 AMCode language: plaintext (plaintext)

Affrontare l'incertezza con un anno a due cifre

Negli esempi sopra ho menzionato che sapevo di avere a che fare con date future. Cosa succede se hai a che fare con date che potrebbero essere future o passate o che hanno più di 100 anni di intervallo?

Mi vengono in mente due esempi:

  • Compleanni
  • Date di scadenza

Se stavi analizzando i dati con date di nascita con anni a due cifre, non sarai in grado di dire con certezza al 100% che indovinerai l'anno a quattro cifre corretto.

Ad esempio, supponiamo che tu ottenga la data di nascita:"1/1/19". Logicamente, tutte le date di nascita saranno nel passato, quindi potresti impostare TwoDigitYearMax =l'anno corrente del 2021. Ma questa data di nascita potrebbe essere realisticamente "1/1/1999" o "1/1/1919", poiché ci sono sicuramente persone che hanno più di 100 anni.

Come affronteresti questo? La mia raccomandazione sarebbe, ogni volta che c'è incertezza, chiedere a una persona di ricontrollare i risultati e confermare l'anno. Questo è il problema con gli anni a due cifre:c'è sempre la possibilità che tu abbia indovinato l'anno sbagliato.