DateTime.Parse z przepełnieniem

Aug 18 2020

Czy istnieje alternatywa dla DateTime.Parse, która zaakceptuje przepełnioną datę lub miesiąc taki jak ten?

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

Kod ten wynika w sposób System.FormatExceptionna DateTime.Parselinii.

Ciąg nie został rozpoznany jako prawidłowy DateTime

Czy mogę przeanalizować ciąg zezwalający na przepełnienie, aby był traktowany jako "2020-02-01"?

Wydaje się, że jest to standard w innych językach / implementacjach.

Odpowiedzi

1 GarrisonBecker Aug 18 2020 at 18:35

Nie wiem, jak mógłbyś to zrobić bez skręcania własnego. Jeśli znasz format swoich dat, możesz wykonać następujące czynności lub coś podobnego.

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

Nie ma na to wpływu czas letni pochodzący z tego miejsca .

Operacje arytmetyczne lub porównania dotyczące lokalnych wartości daty i godziny nie uwzględniają, czy dana wartość jest niejednoznaczna lub nieprawidłowa, ani nie uwzględniają skutków jakichkolwiek reguł korekty, które wynikają z przejścia lokalnej strefy czasowej na lub z czasu letniego.