DateTime.Parse con overflow

Aug 18 2020

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.FormatExceptionsulla DateTime.Parseriga.

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

1 GarrisonBecker Aug 18 2020 at 18:35

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.