我收到错误在将字符串转换为日期时间格式时,字符串未被识别为有效的DateTime。我试图将“25-11-2013 06:25:33 PM”转换为日期格式。任何人都可以帮我解决这个问题。
protected void text_changed(object sender, EventArgs e)
{
if (frm.Text == "")
{
Label1.Visible = true;
Label1.Text = "You can leave from textbox blank";
return;
}
string dt = TextBox1.Text;
string amt = dt.ToString();
string ams = amt.ToString() + " " + frm.Text;
DateTime dts = DateTime.ParseExact(ams, "MM/dd/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
string ams1 = amt.ToString() + "" + TextBox2.Text;
DateTime dts1 = DateTime.ParseExact(ams1, "MM/dd/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture);
TimeSpan dur = DateTime.Parse(dts1.ToString()).Subtract(DateTime.Parse(dts.ToString()));
double res = 0.0;
res = dur.TotalHours * 20;
TextBox3.Text = res.ToString();
}
答案 0 :(得分:2)
如果用户输入的是“25-11-2013 06:25:33 PM”,那么您的格式字符串必须是:
string dateFormat = "dd-MM-yyyy hh:mm:ss tt";
您的代码“MM / dd / yyyy hh:mm:ss tt”中的格式字符串要求用户输入日期为“11/25/2013 06:25:33 PM”。此处描述了所有自定义DateTime格式字符串选项:http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
如果您允许用户只输入自由格式字符串,那么解析日期会遇到问题。您最好的选择是添加日历控件或其他一些构造用户输入的方法,这样您就不必解析自由格式的字符串。
使用Convert.ToDateTime可以省去设置预期格式的麻烦,因为它最好找到适合的日期格式。另一方面,如果用户输入的日期可以通过多种方式解析,则可能无法得到您的预期......
string dts = "09/10/11 06:25";
DateTime dt = System.Convert.ToDateTime(dts);
在我的瑞典系统上,它转换为2009-10-11,yy / mm / dd,但使用美国背景预期日期为2011-09-10,mm / dd / yy。
如果您可以让用户指示或选择他们的文化,那么从自由格式解析日期/时间会更容易 - 因为用户更有可能输入文化上正确的字符串。
//this is parsing the datetime using Swedish format
string theCulture = "sv-SE";
string localDts = "2013-11-25 06:25";
DateTime localDt = DateTime.Parse(localDts, System.Globalization.CultureInfo.CreateSpecificCulture(theCulture));
如果无法做到这一点,您应该考虑用户在系统中输入日期和时间的不同方式,并将它们添加到支持的字符串数组中。您可能需要添加不同字符串的负载,因为每个格式字符串都会解析一个确切的格式,用户可能会将月,日,小时等输入为单个数字或省略秒部分。这是一个解析一堆不同格式的例子,这绝不是对所有备选方案的全面覆盖......
//A few different strings to test
string dts1 = "25-11-2013 6:25:33";
string dts2 = "11/25/2013 6:25:33";
string dts3 = "25-11-2013 06:25:33";
string dts4 = "11/25/2013 06:25:33";
string dts5 = "25-11-2013 6:25:33 PM";
string dts6 = "11/25/2013 6:25:33 PM";
string dts7 = "25-11-2013 06:25:33 PM";
string dts8 = "11/25/2013 06:25:33 PM";
string dts9 = "25-11-2013 6:5:33 PM";
string dts10 = "11/25/2013 6:5:33 PM";
//The supported datetime formats as an array
string[] dateFormats = {
"dd-MM-yyyy hh:mm:ss tt",
"dd-MM-yyyy h:mm:ss tt",
"dd-MM-yyyy h:m:ss tt",
"dd-MM-yyyy HH:mm:ss",
"dd-MM-yyyy H:mm:ss",
"dd-MM-yyyy H:m:ss",
"MM/dd/yyyy hh:mm:ss tt",
"MM/dd/yyyy h:mm:ss tt",
"MM/dd/yyyy h:m:ss tt",
"MM/dd/yyyy HH:mm:ss",
"MM/dd/yyyy H:mm:ss",
"MM/dd/yyyy H:m:ss"
};
//Parse all the sample strings
DateTime dt1 = DateTime.ParseExact(dts1, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
DateTime dt2 = DateTime.ParseExact(dts2, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
DateTime dt3 = DateTime.ParseExact(dts3, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
DateTime dt4 = DateTime.ParseExact(dts4, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
DateTime dt5 = DateTime.ParseExact(dts5, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
DateTime dt6 = DateTime.ParseExact(dts6, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
DateTime dt7 = DateTime.ParseExact(dts7, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
DateTime dt8 = DateTime.ParseExact(dts8, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
DateTime dt9 = DateTime.ParseExact(dts9, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);
DateTime dt10 = DateTime.ParseExact(dts10, dateFormats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None);