DateTime.Parse with overflow

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

นี้ไม่ได้รับผลกระทบจากกลางวันเวลาออมทรัพย์ที่มาที่นี่

การดำเนินการทางคณิตศาสตร์หรือการเปรียบเทียบกับค่าวันที่และเวลาท้องถิ่นจะไม่พิจารณาว่าค่าใดค่าหนึ่งไม่ชัดเจนหรือไม่ถูกต้องหรือไม่และไม่คำนึงถึงผลกระทบของกฎการปรับเปลี่ยนใด ๆ ที่เป็นผลมาจากการเปลี่ยนเขตเวลาท้องถิ่นไปเป็นหรือจากเวลาออมแสง