【问题标题】:DateTime.Parse with overflowDateTime.Parse 溢出
【发布时间】:2020-08-18 11:12:23
【问题描述】:

是否有替代 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);
        }
    }
}

此代码在DateTime.Parse 行上生成System.FormatException

字符串未被识别为有效的日期时间

我能否解析允许溢出的字符串,使其被视为"2020-02-01"

这似乎是其他语言/实现的标准。

【问题讨论】:

  • “这似乎是其他语言/实现的标准。”什么?你能说出支持这个的语言/实现吗?
  • 即使是 javascript 也不允许这样做:Date.parse("2020-01-32") => NaN
  • 所以你想要DateTime.Parse("2020-01").AddDays(int.Parse("32") - 1);
  • 刚刚发现 Java 的 SimpleDateFormat 允许 32 天,尽管您可以通过 setLenient(false) 禁止它...也就是说,SimpleDateFormat 是一个 糟糕 API远非标准。
  • “只要你知道自己在做什么,就不会那么糟糕” - 是的,发明你自己的 DateTime 格式糟糕的,无论如何什么。你为什么需要这个?你能考虑替代方案吗?

标签: c# datetime


【解决方案1】:

如果不自己动手,我不知道你怎么能做到这一点。如果您知道日期时间的格式,则可以执行以下操作或类似操作。

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

这不受夏令时影响,来源here

对本地日期和时间值的算术或比较操作 不考虑特定值是否模糊或无效,也不考虑 他们是否考虑到任何调整规则的影响 从本地时区转换到夏令时或从夏令时转换。

【讨论】:

  • 那不会因为夏令时而改变时间?
  • 根据this,我相信 DateTime 不会考虑夏令时。
  • rextester.com/ZKC79199 我跑了 366 次,这应该可以完全测试了吧?
  • 也刚刚找到this。 “对本地日期和时间值的算术或比较操作不考虑特定值是否不明确或无效,也不考虑本地时区转换为夏令时或从夏令时转换产生的任何调整规则的影响。 "
  • 如果您想要@Garrison Becker,请将该参考添加到您的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多