1

Windows 服务给出的 String 未被识别为有效的 DateTime 异常,但相同的代码在控制台应用程序中正常运行

Object max = cmd.ExecuteScalar();   //max will have 6/30/2012 12:00:00 AM 
DateTime currentDt = DateTime.Now;
currentDt = DateTime.ParseExact(max.ToString(), "M/d/yyyy h:mm:ss tt", CultureInfo.CurrentCulture.DateTimeFormat);                         //This Line Gives Error in WindowsService Only
StreamWriter sw = new StreamWriter("E:\\ram\\SampleService.txt", true);
sw.WriteLine(currentDt.ToString());
sw.Close();

我什至将系统日期时间格式设置更改为英语 - 我们的 Settings.ShortDatetime 是 M/d/yyyy 而 Longtime 是 h:mm:ss tt。

有人可以帮我解决这个问题吗?

4

4 回答 4

2

我的猜测是系统区域设置与您的用户区域设置不同。如果您的系统语言环境使用“/”以外的其他内容作为日期分隔符,它将无法匹配格式字符串中的“/”。

我建议您更改为 use CultureInfo.InvariantCulture,此时它应该可以工作 -如果的值max.ToString()实际上是“6/30/2012 12:00:00 AM”。您是否验证了在失败的情况下,这就是您获得的价值?

但是,如果您的值来自数据库,为什么要以字符串形式存储它呢?你确定它甚至一个字符串?如果它实际上是 a DateTime,那么当您调用时,ToString()您将使用当前区域性的默认格式来转换它 - 这在返回的路上很容易失败。即使现在字符串,真的必须是吗?您可以引入的字符串转换越少越好。

(顺便说一句,使用File.WriteAllTextorFile.AppendAllText比使用StreamWriter这样的 a 更简单。如果您确实需要使用 a StreamWriter,请记住使用using语句来正确处理资源。)

于 2012-11-21T06:51:41.640 回答
0

在没有 CultureInfo 的情况下尝试:

currentDt = DateTime.ParseExact(max.ToString(), "M/d/yyyy h:mm:ss tt", null);
于 2012-11-21T06:53:13.320 回答
0

您的 SQL 请求是否返回DateTimeString值?

我也不明白你为什么ParseExact在这种情况下使用。在您的情况下,我建议使用带InvariantCulture参数的 Parse 方法:

currentDt = DateTime.Parse(max.ToString(), CultureInfo.InvariantCulture);

如果您的max值是 DateTime 那么您根本不需要进行解析。您只需要检查它是否为 DBNull.Value:

if (max != DBNullValue)
{
    currentDt = (DateTime)max;
}
于 2012-11-21T08:05:24.737 回答
0

我在构建 Windows 服务时遇到了同样的问题。在那,我尝试将字符串日期转换为日期时间格式。为此,我使用了格式字符串 date_time = Day + "/" + Mn + "/" + Yr + " " + Hr + ":" + Min; 并尝试将其转换为 datetime()。此格式在 Windows 窗体应用程序中正常运行,但在 Windows 服务项目中不正常运行。

解决方案 :

我用这种格式字符串更改了上面的字符串格式 date_time = Mn + "/" + Day + "/" + Yr + " " + Hr + ":" + Min; , 然后将其传递给 datetime()。喜欢跟随:

字符串 date_time = Mn + "/" + Day + "/" + Yr + " " + Hr + ":" + Min;DateTime dt_1 = Convert.ToDateTime(date_time);

默认情况下,.NET 使用 en-US 文化,根据该文化,日期采用月/日/年格式

这是 100% 的工作。

于 2018-06-09T10:35:57.080 回答