当分钟包含值60
时,我会收到异常var date = "30/10/14 08:60";
var result = DateTime.ParseExact(date, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None);
我如何正确解析它?
答案 0 :(得分:3)
传递正确的值(>=0 || <=59
)或使用它:
var date = "30/10/14 08:60";
DateTime dateResult;
bool canParse = DateTime.TryParseExact(date, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateResult);
if (!canParse)
{
string datePart = date.Split().First();
DateTime dtOnly;
if (DateTime.TryParseExact(datePart, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dtOnly))
{
string timePart = date.Split().Last();
string hourPart = timePart.Split(':')[0];
string minutePart = timePart.Split(':').Last();
int hour, minute;
if (int.TryParse(hourPart, out hour) && int.TryParse(minutePart, out minute))
{
TimeSpan timeOfDay = TimeSpan.FromHours(hour) + TimeSpan.FromMinutes(minute);
dateResult = dtOnly + timeOfDay; // 10/30/2014 09:00:00
}
}
}
答案 1 :(得分:3)
首先,数据无效,这就是引发异常的原因。
所以,基本上有两种解决方案:
如果数据来自第三方,我的建议是,在咨询了您的老板或公司的律师后,您/您的公司会要求第三方提供有效的数据,因为您不会这样做。有法定义务来修复/容忍第三方的无效数据。 IMO,你不应该。
如果数据来自您的旧内部系统,您/公司应该修复可能产生的错误60.如果由于某些原因很快就无法解决错误,您可以编写一个解析器,例如使用正则表达式解析数据并容忍60。
所以正则表达式的第二个分辨率是直接回答你的问题。但是,请注意&#34; 30/10/14 08:60&#34;无效,必须迟早在数据源中修复。
顺便说一下,您可以尝试与some regular expressions建立链接。
答案 2 :(得分:2)
国际大会每小时60分钟。 第60分钟将是59,事实上,如果从0到59计数,他们发现他们是60个数字。你写的8:60的日期不存在,它们的值是9:00。
试试这个(显然只有date1会引发异常):
var date = "30/10/14 8:59";
var date1 = "30/10/14 9:00";
var result = DateTime.ParseExact(date, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None);
var result1 = DateTime.ParseExact(date1, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None);
此外,您可以使用它来控制数据和接收消息true / false
var date = "30/10/14 08:60";
DateTime outData;
Boolean flagCorrectData = DateTime.TryParseExact(date, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out outData);
if (flagCorrectData)
{
MessageBox.Show("Date correct");
}
else
{
MessageBox.Show("Date error");
}
答案 3 :(得分:1)
如果您始终知道date
字符串的时间部分是否格式为HH:mm,则可以执行此操作以获得正确的DateTime date
:
string dateString = "30/10/14 08:60";
string[] dateParts = dateString.Split(' ');
DateTime date = DateTime.ParseExact(dateParts[0],"dd/MM/yy",CultureInfo.InvariantCulture);
string[] timeParts = dateParts[1].Split(':');
date=date.AddMinutes(double.Parse(timeParts[0])*60+double.Parse(timeParts[1]));
答案 4 :(得分:1)
如果你只关心60的特殊情况,你可以明确地使用ParseExact
中的60:
string date = "30/10/14 08:60";
DateTime result;
if(DateTime.TryParseExact(date, "dd/MM/yy HH:mm",
CultureInfo.InvariantCulture, DateTimeStyles.None,out result))
{
return result;
}
//Handle weird :60
if(DateTime.TryParseExact(date, "dd/MM/yy HH:60",
CultureInfo.InvariantCulture, DateTimeStyles.None,out result))
{
return result.AddMinutes(60);
}
throw new ArgumentException("date");