DateTime.Parse mit Überlauf

Aug 18 2020

Gibt es eine Alternative zu DateTime.Parse, die ein solches Überlaufdatum oder einen solchen Monat akzeptiert?

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

Dieser Code führt zu einem System.FormatExceptionin der DateTime.ParseZeile.

Die Zeichenfolge wurde nicht als gültige DateTime erkannt

Kann ich die Zeichenfolge analysieren, die einen Überlauf zulässt, damit sie als behandelt wird "2020-02-01"?

Das scheint in anderen Sprachen / Implementierungen Standard zu sein.

Antworten

1 GarrisonBecker Aug 18 2020 at 18:35

Ich weiß nicht, wie Sie das tun können, ohne Ihre eigenen zu rollen. Wenn Sie das Format Ihrer Datenzeiten kennen, können Sie Folgendes oder ähnliches tun.

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

Dies wird durch die hier bezogene Sommerzeit nicht beeinflusst .

Arithmetik- oder Vergleichsoperationen für lokale Datums- und Zeitwerte berücksichtigen weder, ob ein bestimmter Wert mehrdeutig oder ungültig ist, noch berücksichtigen sie die Auswirkungen von Anpassungsregeln, die sich aus dem Übergang der lokalen Zeitzone zur oder von der Sommerzeit ergeben.