DateTime.Parse dengan overflow

Aug 18 2020

Apakah ada alternatif untuk DateTime.Parse yang akan menerima tanggal atau bulan yang melimpah seperti ini?

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

Kode ini menghasilkan sebuah System.FormatExceptionon the DateTime.Parseline.

String tidak dikenali sebagai DateTime yang valid

Dapatkah saya mengurai string yang memungkinkan overflow sehingga akan diperlakukan sebagai "2020-02-01"?

Itu tampaknya menjadi standar dalam bahasa / implementasi lain.

Jawaban

1 GarrisonBecker Aug 18 2020 at 18:35

Saya tidak tahu bagaimana Anda bisa melakukan ini tanpa menggulung sendiri. Jika Anda mengetahui format waktu data Anda, Anda dapat melakukan hal berikut, atau yang serupa.

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

Ini tidak terpengaruh oleh waktu musim panas, bersumber di sini .

Operasi aritmatika atau perbandingan pada nilai tanggal dan waktu lokal tidak mempertimbangkan apakah nilai tertentu ambigu atau tidak valid, juga tidak memperhitungkan pengaruh aturan penyesuaian yang dihasilkan dari transisi zona waktu lokal ke atau dari waktu musim panas.