【问题标题】:Date was not recognized as a valid DateTime日期未被识别为有效的日期时间
【发布时间】:2022-01-02 21:39:53
【问题描述】:

有点问题,我现在无法解决。

我在我的树莓派上运行了一个不和谐机器人,它有一个自动消息系统,可以在一定时间或确切日期之后发送。

我的代码在 Windows 上调试时可以在 Windows 上运行,但在 Linux 上运行已发布的项目时控制台会抛出警告。

日期取自我的 MySQL 数据库中的表并放入 DataTable。从 DataRow 中获取日期的代码是:

DateTime datetime = DateTime.ParseExact(row["datetime"].ToString(), "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture);

为什么会这样?无论我如何格式化字符串(点、破折号或斜杠),警告仍然存在。消息未发送。

我什至尝试使用正则表达式删除不可见的空格,但也不起作用。 (有问题的正则表达式,虽然我放弃了它,因为它没有产生任何结果)

Regex.Replace($"{row["datetime"].ToString()}", @"[^\d\s\.:]", string.Empty);

【问题讨论】:

  • MySql db 上列的数据类型是什么?
  • 当然是“日期时间”。
  • DateTime datetime = Convert.ToDateTime(row["datetime"]);
  • 那你为什么要把一个DateTime转换成一个字符串然后再转换回一个DateTime呢? DateTime 列已经是 .... 日期时间。你只需要一个演员或至少检查空值,然后演员

标签: c# windows datetime raspberry-pi


【解决方案1】:

如果 RDBMS 类型是DateTime,那么我们为什么要转换为string,然后再将其解析回DateTime?我们直接做吧:

 DateTime datetime = Convert.ToDateTime(row["datetime"]);

并让.net 转换 装箱 DateTimerow["datetime"] 的类型为object?)到DateTime

【讨论】:

  • Convert”没有必要或陷入“转换”的心态。它已经是一个DateTime 值。在没有附加层的情况下铸造拆箱,无论如何最终都会铸造。 DateTime datetime = (DateTime)row["datetime"];
  • 同意@madreflection:整个Convert.To心态需要停止。我在 Stack Overflow 上到处都能看到它,尤其是使用 ADO.net 代码。这是完全没有必要的,直接演员就可以完成这项工作
【解决方案2】:

有几个问题 - 在最高级别,您的 ParseExact 方法遇到与提供的格式不匹配的日期时间字符串。

根据您发布的代码,预期格式为dd.MM.yyyy HH:mm:ss,并且在您的异常异常中,显示不匹配的日期时间字符串(8/2/2021 2:00:00 PM):

  • 包含/,您的预期格式为.
  • dd 是两位数的日期,但输入的日期时间字符串只有一位数的天数
  • MM 需要两位数的月份,而输入的日期时间只有一位数的月份
  • 字符串包含AM/PM,而您的格式忽略了这一点。

最后不清楚你的日期格式是月日年还是日月年。

第二个问题是ParseExact 应该包含在try/catch 块中,这样您的代码就可以处理传入的意外格式化日期时间字符串的情况,而不会崩溃。

要解决这个问题,请将您的调用包装到 try/catch 中,并优雅地处理 FormatException

然后确保格式字符串与预期的输入字符串匹配。

Here is the .NET reference for the various DateTime format tokens

【讨论】:

    【解决方案3】:

    错误消息让您知道问题所在。

    你有:

    DateTime datetime = DateTime.ParseExact(row["datetime"].ToString(), "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture);
    

    值得注意的是,您是说日期格式将是“dd.MM.yyyy HH:mm:ss”

    那么你的错误信息是说你无法解析:

    8/2/2021 2:00:00 PM
    

    本质上是“d/M/yyyy h:mm:ss tt”的格式(假设天早于几个月)。

    如果您将代码更改为:

    DateTime datetime = DateTime.ParseExact(row["datetime"].ToString(), "d/M/yyyy h:mm:ss tt", CultureInfo.InvariantCulture);
    

    你应该很高兴。 DateTime.ParseExact 做它在锡上所说的,它解析日期格式完全你说它应该如何。如果您不确定是否可以使用 DateTime.Parse() (但您有时会遇到日期/月份错误的问题)。

    使用以下代码测试:

    var myDateString = "8/2/2021 2:00:00 PM";
    DateTime datetime = DateTime.ParseExact(myDateString, "d/M/yyyy h:mm:ss tt", CultureInfo.InvariantCulture);
    Console.WriteLine(datetime.ToString());
    

    【讨论】:

    • 它没有。正如我在帖子中所说,我尝试使用斜线、点和破折号。它不起作用。更不用说它可以在 Windows 上运行,只是不能在 Linux 上运行。
    • 你能确保代码和我发布的完全一样(包括时间部分,例如你需要tt),然后再次运行并发布错误?因为错误非常具体,您正在尝试使用斜杠解析日期时间,而您的代码显然没有设置为解析它。
    • 我做了,恐怕错误是一样的。 imgur.com/a/vYsCwno
    • 酷。编辑了我的答案,它仍然是日期格式,因为您使用的是 AM/PM,您需要使用小写 h,并且因为您的天/月没有前缀 0,所以您需要使用单个 d/m 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多