如何用分钟分析日期包含值60
本文关键字:日期 包含值 何用 分钟 | 更新日期: 2023-09-27 18:30:09
当分钟包含值60 时,我得到异常
var date = "30/10/14 08:60";
var result = DateTime.ParseExact(date, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None);
如何正确解析??
要么传递一个正确的值(>=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
}
}
}
首先,数据无效,这就是引发异常的原因。
因此,基本上有两种分辨率:
-
如果数据来自第三方,我的建议是,在咨询您的老板或公司的律师后,您/您的公司要求第三方提供有效数据,因为您没有法律义务为第三方修复/容忍无效数据。IMO,你不应该。
-
如果数据来自您的遗留内部系统,您/公司应该修复可能产生60的错误。如果由于某些原因无法很快修复这些错误,您可以编写一个解析器,例如使用正则表达式来解析数据并容忍60。
因此,正则表达式的第二个解决方案是直接回答您的问题。但是,请注意,"30/10/14 08:60"无效,必须在数据源中尽快修复。
顺便说一句,这里有一些你可以尝试的正则表达式的链接。
对于国际会议来说,是一小时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);
此外,您可以使用它来控制数据并接收消息真/假
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");
}
如果您总是知道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]));
如果你只关心: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");