See the end of this message for details on invoking just-in-time (JIT) debugging instead of this dialog box.
************** 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
declaration global
public DateTime rendVous;
public DateTime temp;
I want to covert string to datetime by ToDateTime() , in my project VS running without any problem but in another pc this String was not recognized as a valid DateTime
temp = Convert.ToDateTime("" dateAf.Date.Day "/" (DateTime.Now.Month 1) "/" DateTime.Now.Year);
this is my method
//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;
}
CodePudding user response:
Convert.ToDateTime
will take into account the current systems Culture and thus expects the string to be in a certain format.
See more info here:
https://docs.microsoft.com/en-us/dotnet/api/system.convert.todatetime?view=net-6.0#System_Convert_ToDateTime_System_String_System_IFormatProvider_
To make this code work on the other system, you could change the system language used, but a better solution is to make sure that the input value is in the current cultures format, or use the second parameter for Convert.ToDateTime()
which is an IFormatProvider
to tell the system which culture to use. That way it will not matter anymore what system runs the code.
In your case you could also write:
temp = new DateTime(DateTime.Now.Year, DateTime.Now.Month 1, dateAf.Date.Day)
instead of
temp = Convert.ToDateTime("" dateAf.Date.Day "/" (DateTime.Now.Month 1) "/" DateTime.Now.Year);
to avoid the date parsing all together. Make sure to not do this when the month is december as that would still result in an invalid datetime.
If you are simply trying to achieve getting the current DateTime 1 month you could do this:
temp = DateTime.Now.AddMonths(1);
which will also work when the current date is in december, and will result in a date in januari the next year.
CodePudding user response:
The reason is failed in other computers is likely to be they have different Cultures, one computer could be trying to parse in American format MM/dd/yyyy and the other one is in dd/MM/yyyy.
You can use DateTime.ParseExact() and specify the format and culture you are trying to parse.
https://docs.microsoft.com/en-us/dotnet/api/system.datetime.parseexact?view=net-6.0
DateTime.ParseExact(temp, "dd/MM/yyyy", CultureInfo.InvariantCulture)