如何修复字符串未被识别为有效的日期时间

how to fix string was not recognized as a valid DateTime

有关调用的详细信息,请参阅此消息的末尾 实时 (JIT) 调试而不是此对话框。

************** Exception Text **************
System.FormatException: String was not recognized as a valid DateTime.
   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
   at System.Convert.ToDateTime(String value)
   at ExtraTutoManager.Dashcont.CulcPay(DateTime dateAf) in D:\coure du soire gestion\visual studio project\ExtraTutoManager\ExtraTutoManage

声明全局


        public DateTime rendVous;
        public DateTime temp;

我想通过 ToDateTime() 将字符串转换为日期时间,在我的项目 VS 运行 中没有任何问题,但在另一台电脑中,此字符串未被识别为有效的 DateTime

temp = Convert.ToDateTime("" + dateAf.Date.Day + "/" + (DateTime.Now.Month + 1) + "/" + DateTime.Now.Year);

这是我的方法

        //Culcs
        public DateTime Culcdate(DateTime dateAf)
        {


            int mont = DateTime.Now.Month - dateAf.Date.Month;
            if (DateTime.Now.Month == dateAf.Date.Month)
            {

                temp = Convert.ToDateTime("" + dateAf.Date.Day + "/" + (DateTime.Now.Month + 1) + "/" + DateTime.Now.Year);
            }
            else if (mont - (mont - 1) >= 1 && DateTime.Now.Day >= dateAf.Date.Day)
            {
                temp = Convert.ToDateTime("" + dateAf.Date.Day + "/" + (DateTime.Now.Month + 1) + "/" + DateTime.Now.Year);

            }
            else if (mont - (mont - 1) >= 1)
            {
                temp = Convert.ToDateTime("" + dateAf.Date.Day + "/" + DateTime.Now.Month + "/" + DateTime.Now.Year);

            }

            return rendVous = temp;
        }

在其他计算机上失败的原因可能是它们具有不同的文化,一台计算机可能正在尝试以美国格式 MM/dd/yyyy 进行解析,而另一台计算机是 dd/MM/yyyy.

您可以使用 DateTime.ParseExact() 并指定您尝试解析的格式和区域性。

https://docs.microsoft.com/en-us/dotnet/api/system.datetime.parseexact?view=net-6.0

DateTime.ParseExact(temp, "dd/MM/yyyy", CultureInfo.InvariantCulture)

Convert.ToDateTime 将考虑当前系统文化,因此期望字符串采用特定格式。 在此处查看更多信息: https://docs.microsoft.com/en-us/dotnet/api/system.convert.todatetime?view=net-6.0#System_Convert_ToDateTime_System_String_System_IFormatProvider_

要使此代码在其他系统上运行,您可以更改使用的系统语言,但更好的解决方案是确保输入值采用当前文化格式,或者使用第二个参数 Convert.ToDateTime() 这是一个 IFormatProvider 来告诉系统使用哪种文化。这样,什么系统运行代码就不再重要了。

在你的情况下你也可以这样写:

temp = new DateTime(DateTime.Now.Year, DateTime.Now.Month + 1, dateAf.Date.Day)

而不是

temp = Convert.ToDateTime("" + dateAf.Date.Day + "/" + (DateTime.Now.Month + 1) + "/" + DateTime.Now.Year);

以避免将日期一起解析。请确保不要在十二月时执行此操作,因为这仍然会导致日期时间无效。

如果您只是想获得当前日期时间 + 1 个月,您可以这样做:

temp = DateTime.Now.AddMonths(1);

当当前日期是 12 月时也可以使用,并会导致下一年的 1 月的日期。