オーバーフローのある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行になります。

文字列が有効な日時として認識されませんでした

オーバーフローを許可する文字列を解析して、次のように扱うことはでき"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);
        }

これは、ここで提供されている夏時間の影響を受けません。

ローカルの日付と時刻の値に対する算術演算または比較演算では、特定の値があいまいであるか無効であるかは考慮されません。また、ローカルタイムゾーンの夏時間への移行または夏時間からの移行に起因する調整ルールの影響も考慮されません。