DateTime.Parse с переполнением

Aug 18 2020

Есть ли альтернатива DateTime.Parse, которая примет такую ​​дату или месяц переполнения?

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

Этот код приводит к появлению System.FormatExceptionна DateTime.Parseлинии.

Строка не была распознана как допустимый DateTime

Могу ли я проанализировать строку, допускающую переполнение, чтобы она была обработана как "2020-02-01"?

Это кажется стандартным для других языков / реализаций.

Ответы

1 GarrisonBecker Aug 18 2020 at 18:35

Я не знаю, как вы могли бы сделать это, не катаясь самостоятельно. Если вы знаете формат даты и времени, вы можете сделать следующее или что-то подобное.

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

Это не зависит от перехода на летнее время, указанного здесь .

Арифметические операции или операции сравнения для локальных значений даты и времени не учитывают, является ли конкретное значение неоднозначным или недопустимым, а также не учитывают влияние каких-либо правил корректировки, возникающих в результате перехода местного часового пояса на летнее время или из него.