Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Convert.ToDateTime导致下午日期/时间值发生FormatException_C#_.net_Datetime_Cultureinfo - Fatal编程技术网

C# Convert.ToDateTime导致下午日期/时间值发生FormatException

C# Convert.ToDateTime导致下午日期/时间值发生FormatException,c#,.net,datetime,cultureinfo,C#,.net,Datetime,Cultureinfo,我们有一个应用程序正在解析以下格式的日期/时间值: 2009-10-10 09:19:12.124 2009-10-10 12:13:14.852 2009-10-10 13:00:00 2009-10-10 15:23:32.022 一个特定的服务器突然(今天)开始在13:00:00或更高时间解析失败。这个特定的客户机有五台服务器,只有一台有问题。我们有几十个其他客户端,总共有数百台服务器没有这个问题 System.FormatException: String was not recogn

我们有一个应用程序正在解析以下格式的日期/时间值:

2009-10-10 09:19:12.124
2009-10-10 12:13:14.852
2009-10-10 13:00:00
2009-10-10 15:23:32.022
一个特定的服务器突然(今天)开始在13:00:00或更高时间解析失败。这个特定的客户机有五台服务器,只有一台有问题。我们有几十个其他客户端,总共有数百台服务器没有这个问题

System.FormatException: String was not recognized as a valid DateTime.
at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
at System.DateTime.Parse(String s, IFormatProvider provider)
at System.Convert.ToDateTime(String value, IFormatProvider provider)
at System.String.System.IConvertible.ToDateTime(IFormatProvider provider)
at System.Convert.ToDateTime(Object value)
我使用DateTime.Parse(s,CultureInfo.CurrentCulture)与DateTime.Parse(s,CultureInfo.InvariantCulture)匹配运行了一个测试,问题只出现在CurrentCulture上。然而,CurrentCulture与所有其他服务器一样是“en-US”,我在区域或语言设置中找不到任何不同之处

以前有人见过这个吗?与我可以研究的内容相关的建议


编辑:谢谢你迄今为止的答案。然而,我正在寻找建议,看看什么配置可能导致它突然改变行为并停止工作,当它工作多年并在数百台其他服务器上工作时。我已经在下一个版本中对其进行了更改,但我正在寻找一个配置更改,以便在当前安装期间修复此问题。

听起来文化对象似乎不理解军事时间符号。老实说,我不知道从哪里开始,但这可能会给你一个起点。

如果你确切地知道格式,告诉应用程序它是什么-使用
DateTime.ParseExact
而不仅仅是
DateTime.Parse
。(正如其他人所说,还要指定不变的文化,以消除任何更多的变异。)这会给您更多的控制:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        Parse("2009-10-10 09:19:12.124");
        Parse("2009-10-10 12:13:14.852");
        Parse("2009-10-10 13:00:00");
        Parse("2009-10-10 15:23:32.022");
    }

    static readonly string ShortFormat = "yyyy-MM-dd HH:mm:ss";
    static readonly string LongFormat = "yyyy-MM-dd HH:mm:ss.fff";

    static readonly string[] Formats = { ShortFormat, LongFormat };

    static void Parse(string text)
    {
        // Adjust styles as per requirements
        DateTime result = DateTime.ParseExact(text, Formats, 
                                              CultureInfo.InvariantCulture,
                                              DateTimeStyles.AssumeUniversal);
        Console.WriteLine(result);
    }
}

解决方案非常简单,请使用
CultureInfo.InvariantCulture
。对于示例数据,这是唯一明智的做法


我知道这并不能解释差异,但您的软件确实不应该依赖“默认”区域性(可能在UI中除外)。

CultureInfo.DateTimeFormat属性的值是什么

“用户可能会选择覆盖 与 通过Windows的当前文化 区域和语文选择部分 控制面板的。例如 用户可以选择显示日期 以不同的格式或使用 默认值以外的货币 文化

如果UseUserOverride为true,则 指定的区域性与当前 Windows的文化性,文化信息 使用这些覆盖,包括用户 属性的设置 已返回DateTimeFormatInfo实例 通过DateTimeFormat属性,以及 NumberFormatInfo的性质 由NumberFormat返回的实例 属性。如果用户设置为 与文化格格不入 与CultureInfo关联,例如 例如,如果选定的日历为 没有一个可选日历 方法和数值的结果 属性中的一个未定义

DateTimeFormat的值 属性和NumberFormat属性 直到您的 应用程序访问该属性。如果 用户可以更改当前设置 文化是一种新的文化,而 应用程序正在运行,然后 应用程序访问 DateTimeFormat或NumberFormat 属性,应用程序检索 新文化的默认设置 而不是 原始文化。保存原始文化 原始当前文件的覆盖 文化,应用程序应该访问 DateTimeFormat和NumberFormat 属性,然后再更改当前 文化。”


可能是某个用户设置超出了这一范围吗?

这是一个粗略的猜测,但可能是类似这样的事件序列导致了问题:

  • 管理员进入所有服务器上的控制面板国际设置,将时间格式从“HH:mm:ss”更改为“HH:mm:ss tt”
  • 管理员仅在其中一台服务器上回收应用程序池(或IIS服务或计算机)
  • 回收服务器上的所有新ASP.NET工作线程现在都将看到更改的时间格式,并且它们的
    DateTime.Parse
    方法将失败。但是,如果其他服务器仍在使用原始工作线程,则它们尚未检测到对当前区域性的更改
    DateTimeFormatInfo


    这是一个非常不可能的情况,但同样,你有一个非常不可能的情况。您可以尝试在所有服务器上回收相关的应用程序池,看看是否有任何变化。

    我们也遇到了同样的问题。只需回收您的应用程序池

    我们有一个运行在Windows2003服务器上的C#.NET2.0Web服务。这项服务已经运行了两年多。我们最近开始在该应用程序中遇到错误。错误消息为“字符串未被识别为有效的日期时间”。另一个web服务返回一个日期,该函数应该返回如下值

    “2010年10月5日12:00:00上午”

    发生错误时,函数返回

    “2010年10月5日12:00:00”

    不正确的返回值在末尾有空格,并且没有AM

    在接下来的几周里,这个问题出现并消失了好几次。在检查windows日志后,我们注意到错误的开始和结束时间与应用程序池回收时间一致(在一到两分钟内),应用程序池回收时间设置为(默认情况下)每29小时发生一次。此问题仅发生在生产web服务器上,而不是在开发或测试服务器上。我们尝试更换服务器,一个月没有出现错误。现在错误又开始了。我们手动重置池,问题立即消失。我们不认为这是一个可接受的解决方案,因为游泳池会定期回收。我们不知道是否需要游泳池回收,但据我们了解,定期回收有助于
    // clear the PM designator
    System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.PMDesignator = ""
    // this will yield "12/25/2012 12:00:00 " (note the extra space at the end)
    Convert.ToDateTime("10/25/2012").ToString()
    
    // clear the PM designator
    System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.PMDesignator = ""
    // this will yield "10/25/2012 12:00:00"
    Convert.ToDateTime("10/25/2012").ToString(System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat)
    // restore the PM designator to "PM"
    System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.PMDesignator = "PM"
    // this will yield "10/25/2012 00:00:00"
    Convert.ToDateTime("10/25/2012").ToString(System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat)