日期未被识别为有效的日期时间
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 DateTime
(row["datetime"]
是类型 object
?) 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 DateTime
(row["datetime"]
是类型 object
?) DateTime