DateTime.Parse con desbordamiento

Aug 18 2020

¿Existe una alternativa a DateTime.Parse que acepte una fecha o mes desbordado como este?

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);
        }
    }
}

Este código da como resultado un System.FormatExceptionen la DateTime.Parselínea.

La cadena no se reconoció como una fecha y hora válida

¿Puedo analizar la cadena que permite el desbordamiento para que se trate como "2020-02-01"?

Eso parece ser estándar en otros lenguajes / implementaciones.

Respuestas

1 GarrisonBecker Aug 18 2020 at 18:35

No sé cómo podrías hacer esto sin tirar el tuyo. Si conoce el formato de sus fechas y horas, puede hacer lo siguiente o algo similar.

        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);
        }

Esto no se ve afectado por el horario de verano, obtenido aquí .

Las operaciones aritméticas o de comparación en valores de fecha y hora locales no tienen en cuenta si un valor particular es ambiguo o no válido, ni tienen en cuenta el efecto de las reglas de ajuste que resultan de la transición de la zona horaria local hacia o desde el horario de verano.