DateTime.Parse con overflow
Esiste un'alternativa a DateTime.Parse che accetterà una data o un mese traboccante come questo?
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Tests
{
[TestClass]
public class DateTimeTest
{
[TestMethod]
public void TestOverflowOfDay()
{
var dt = DateTime.Parse("2020-01-32");
var str = dt.ToString();
Assert.AreEqual("2020-02-01 00:00:00", str);
}
}
}
Questo codice si traduce in una System.FormatException
sulla DateTime.Parse
riga.
La stringa non è stata riconosciuta come DateTime valido
Posso analizzare la stringa consentendo l'overflow in modo che venga trattata come "2020-02-01"
?
Sembra essere standard in altri linguaggi / implementazioni.
Risposte
Non so come potresti farlo senza rotolare il tuo. Se conosci il formato dei tuoi datetimes, puoi fare quanto segue o qualcosa di simile.
static void Main(string[] args)
{
var date = GetCustomDateTime("2020-01-32");
Console.WriteLine(date.ToString("yyyy-MM-dd HH:mm:ss"));
}
private static DateTime GetCustomDateTime(string dateTimeString)
{
var split = dateTimeString.Split('-');
var yearMonth = DateTime.ParseExact($"{split[0]}-{split[1]}", "yyyy-MM", CultureInfo.InvariantCulture);
return yearMonth.AddDays(int.Parse(split[2])-1);
}
Questo non è influenzato dall'ora legale, proveniente da qui .
Le operazioni aritmetiche o di confronto sui valori di data e ora locali non considerano se un determinato valore è ambiguo o non valido, né tengono conto dell'effetto di eventuali regole di regolazione che risultano dalla transizione del fuso orario locale all'ora legale o dall'ora legale.