DateTime.Parse avec débordement

Aug 18 2020

Existe-t-il une alternative à DateTime.Parse qui acceptera une date ou un mois de débordement comme celui-ci?

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

Ce code entraîne un System.FormatExceptionsur la DateTime.Parseligne.

La chaîne n'a pas été reconnue comme un DateTime valide

Puis-je analyser la chaîne autorisant le débordement pour qu'elle soit traitée comme "2020-02-01"?

Cela semble être la norme dans d'autres langages / implémentations.

Réponses

1 GarrisonBecker Aug 18 2020 at 18:35

Je ne sais pas comment vous pourriez faire ça sans rouler le vôtre. Si vous connaissez le format de vos datetimes, vous pouvez faire ce qui suit, ou quelque chose de similaire.

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

Ceci n'est pas affecté par l'heure d'été, provenant ici .

Les opérations arithmétiques ou de comparaison sur les valeurs de date et d'heure locales ne prennent pas en compte si une valeur particulière est ambiguë ou invalide, ni ne tiennent compte de l'effet des règles d'ajustement résultant de la transition du fuseau horaire local vers ou depuis l'heure d'été.