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

Date was not recognized as a valid DateTime

有点遇到我现在无法解决的问题。

我的 raspberry pi 上有一个 discord bot 运行,它有一个自动消息系统,在经过一定时间或确切日期后发送。

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

日期取自我的 MySQL 数据库中的 table 并放入 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);

错误消息让您了解问题所在。

你有:

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() (但你偶尔可以 运行 解决 days/months 错误的问题)。

使用以下代码测试:

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

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

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

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

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

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

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

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

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

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

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

并让 .net convert boxed DateTimerow["datetime"] 是类型 object ?) DateTime