DateTime.Parse có tràn

Aug 18 2020

Có giải pháp thay thế cho DateTime.Parse chấp nhận ngày hoặc tháng tràn như thế này không?

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

Mã này kết quả trong một System.FormatExceptiontrên DateTime.Parseđường.

Chuỗi không được công nhận là DateTime hợp lệ

Tôi có thể phân tích cú pháp chuỗi cho phép tràn để nó được coi là "2020-02-01"không?

Điều đó dường như là tiêu chuẩn trong các ngôn ngữ / cách triển khai khác.

Trả lời

1 GarrisonBecker Aug 18 2020 at 18:35

Tôi không biết làm thế nào bạn có thể làm điều này mà không cần lăn bánh của riêng bạn. Nếu bạn biết định dạng ngày giờ của mình, bạn có thể làm như sau hoặc cách nào đó tương tự.

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

Điều này không bị ảnh hưởng bởi thời gian tiết kiệm ánh sáng ban ngày, có nguồn tại đây .

Các phép toán số học hoặc so sánh trên các giá trị ngày và giờ địa phương không xem xét liệu một giá trị cụ thể có mơ hồ hay không hợp lệ hay không, cũng như không tính đến ảnh hưởng của bất kỳ quy tắc điều chỉnh nào do chuyển đổi múi giờ địa phương sang hoặc từ giờ tiết kiệm ánh sáng ban ngày.